如何将json数组拆分成字符串?

时间:2015-02-12 13:39:45

标签: java json gson

我有一个带有由对象组成的json数组的String,如下所示:

 [{..},{..}, ...]

我想将此数组中的每个对象提取为字符串。数组长度未知,对象是任意的。

一种天真的方法可能只是简单地分开"},{",但它不会在实践中发挥作用。当然,我可以将字符串反序列化为Java对象数组,然后将每个对象序列化为字符串,但这不安全,因为最终输出可能不再是逐字节的输入(这是一个要求。此外,性能可能是一个问题。)

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

好吧,我发布这段代码有点惭愧。它根本不是最优的,看起来很糟糕,但如果你想要完全不变的内容,它可能会引导你走向正确的方向。

enum ParserState {
    READING_OBJECT,
    READING_ARRAY
}


public static List<String> extractObjects(String array) throws ParseException {
    ParserState state = ParserState.READING_ARRAY;
    ArrayList<String> result = new ArrayList<String>();
    StringBuilder currentObject = null;
    int i = 0;
    int parenthesisBalance = 0;
    for (char c : array.toCharArray()) {
        switch (c) {
            case '{': {
                if (state == ParserState.READING_ARRAY) {
                    state = ParserState.READING_OBJECT;
                    currentObject = new StringBuilder();
                }
                parenthesisBalance++;
                currentObject.append(c);
                break;
            }
            case '}': {
                if (state == ParserState.READING_ARRAY) {
                    throw new ParseException("unexpected '}'", i);
                } else {
                    currentObject.append(c);
                    parenthesisBalance--;
                    if (parenthesisBalance == 0) {
                        state = ParserState.READING_ARRAY;
                        result.add(currentObject.toString());
                    }
                }
                break;
            }
            default: {
                if (state == ParserState.READING_OBJECT) {
                    currentObject.append(c);
                }
            }
        }
        i++;
    }
    return result;
}

答案 1 :(得分:1)

使用GSON Lib尝试下面的代码 - 您也可以放置json对象而不是字符串LOCATION

public static void main(String[] args) {
    String obj = "{'id':'joe','ts':'2014-12-02T13:58:23.801+0100','foo':{'bar':{'v1':50019820,'v2':0,     'v3':0.001, 'v4':-100, 'v5':0.000001, 'v6':0.0, 'b':true}}}".replace("'", "\"");
    String string = String.format("[%s,%s,%s,%s]", obj , obj , obj , obj );

    JsonParser parser = new JsonParser();
    JsonArray arr = (JsonArray)parser.parse(string);

    //JsonArray arr = o.getAsJsonArray();
    Iterator<JsonElement> itr  = arr.iterator();
    while(itr.hasNext()){
        JsonElement val = itr.next();
        System.out.println(val);
    }
}

答案 2 :(得分:0)

试试这段代码:

public List<String> split(String jsonArray) throws Exception {
        List<String> splittedJsonElements = new ArrayList<String>();
        ObjectMapper jsonMapper = new ObjectMapper();
        JsonNode jsonNode = jsonMapper.readTree(jsonArray);

        if (jsonNode.isArray()) {
            ArrayNode arrayNode = (ArrayNode) jsonNode;
            for (int i = 0; i < arrayNode.size(); i++) {
                JsonNode individualElement = arrayNode.get(i);
                splittedJsonElements.add(individualElement.toString());
            }
        }
        return splittedJsonElements;
}

我使用了杰克逊图书馆。

希望这有帮助!