Java Jackson-处理对象数组、附加和删除

Java Jackson-处理对象数组、附加和删除,java,json,jackson,fasterxml,Java,Json,Jackson,Fasterxml,我正在使用Java中的Jackson API来处理JSON。我在这里和那里做了一些工作,但没有太深入 目前,我正在寻找一种好方法来获取从POJO列表创建的JSON对象数组(通过流或字符串),并附加或删除POJO。在追加的情况下,实际上不需要重复检查。作为一个简单的例子,假设我使用一个名为“field”的变量从Java对象列表构建了这个数组: 我想附加一个相同类型的对象,将“field”设置为“value3”。我可以简单地将整个数组反序列化为Java对象列表,添加新对象,然后将其序列化回JSON,

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

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


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

我找到了一种方法,但奇怪的是,它的速度是直接反序列化add-reserialze方法的两倍多,该方法有500个POJO列表,每个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-to-Java-to-JSON方法


编辑:啊哈!发现JsonGenerator可以使用
copyCurrentStructure(JsonParser)
直接从JsonParser复制当前结构。在while循环中使用此方法速度更快,现在比bruteforce方法快了很多。

这是一个没有实际意义的问题。您是使用jackson将其附加为对象还是仅编辑字符串?就我个人而言,我会坚持和杰克逊在一起,而不是把两者结合起来。它很快,我不想直接操纵字符串。我一直在翻阅杰克逊的一些文档,但还有很多东西要看,我还没有找到如何直接与杰克逊一起执行这个操作。理想情况下,我可以使用Jackson包装InputStream并将其直接写入OutputStream,在JSON在流之间传递时,在末尾添加新对象或删除现有对象;因此,从
JsonParser
直接复制到
jsongeneraor
更有效。这就是为什么您最初的想法(读入
列表、追加、写入)或使用流式API进行低级开发都是最好的方法。
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();