杰克逊 - 使用对象数组,追加和删除

时间:2014-10-10 15:56:33

标签: java json jackson fasterxml

我正在使用Java中的Jackson API来处理JSON。我一直在这里和那里工作,但没有太深入。

目前,我正在寻找一种很好的方法来获取从POJO列表创建的JSON对象数组(通过流或字符串)并追加或删除POJO。在附加的情况下,不一定需要重复检查。举一个简单的例子,假设我有一个Java对象列表构建的这个数组,它有一个名为“field”的变量:

[{"field":"value"},{"field":"value2"}]

我想追加一个相同类型的对象,并将“field”设置为“value3”。我可以简单地将整个数组反序列化为Java对象列表,添加新对象,然后将其序列化为JSON,但这感觉有点过分。如果我可以使用Jackson简单地序列化新对象并将其附加到JSON数组的末尾,那会更好。这同样适用于从数组中删除现有对象。

1 个答案:

答案 0 :(得分:1)

我找到了一种方法,但奇怪的是,它的速度是直接反序列化 - 添加 - 切割方法的两倍,其中500个POJO的列表各有三个字段,而且只会变得更糟有更多的对象。

ObjectMapper mapper = new ObjectMapper();
JsonParser parser = mapper.getJsonFactory().createJsonParser(input);
JsonGenerator gen = mapper.getJsonFactory().createJsonGenerator(output, JsonEncoding.UTF8);
gen.writeStartArray();
parser.nextToken();
while (parser.nextToken() == JsonToken.START_OBJECT) {
    //gen.writeTree(parser.readValueAsTree());
    //parser.skipChildren();
    //EDIT: This is much faster as the only method in the loop:
    gen.copyCurrentStructure(parser);
}
gen.writeTree(mapper.valueToTree(/*new Object to add*/);
gen.writeEndArray();
gen.close();
parser.close();

即使我没有将每个对象都作为树来获取,而是将它们作为字段/值迭代地移动,但它的速度要快一些,但仍然比替代方案慢得多。这是预期的还是有更好的方法来处理它作为流数据而不是批量JSON到Java到JSON方法?

编辑:AHA!发现JsonGenerator可以使用copyCurrentStructure(JsonParser)直接从JsonParser复制当前结构。在while循环中使用它会更快,现在可以使用相当多的bruteforce方法。