我使用Java中的Jackson API来处理JSON。我已经在这里和那里做了一些工作,但没有什么太深入的。
目前,我正在寻找一种很好的方法来获取从POJO列表中创建的JSON对象数组(通过流或字符串),并附加或删除POJO。在附加的情况下,重复检查并不是真正必要的。举个简单的例子,假设我有一个由Java对象列表构建的数组,其中有一个名为"field"的变量:
[{"field":"value"},{"field":"value2"}]
我想附加一个相同类型的对象,其中"field"设置为"value3"。我可以简单地将整个数组反序列化为Java对象列表,添加新对象,然后将其序列化回JSON,但这感觉有些过头了。如果我可以使用Jackson简单地序列化新对象并将其附加到JSON数组的末尾,那会更好。这同样适用于从数组中删除现有对象。
我找到了一种方法,但奇怪的是,它的速度是直接反序列化add-rereseialze方法的两倍多,该方法具有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到Java到JSON的方法?
编辑:啊哈!发现JsonGenerator可以直接从带有copyCurrentStructure(JsonParser)
的JsonParser中复制当前结构。在while循环中使用它会更快,并且现在比brueforce方法快了相当多。