1

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

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

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

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

4

1 回答 1

1

我找到了一种方法,但奇怪的是,它比直接反序列化-添加-重新序列化方法慢两倍多,该方法有 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). 在 while 循环中使用它会更快,现在比蛮力方法要快很多。

于 2014-10-10T17:22:50.947 回答