json 在Jackson中读取值和读取树:什么时候用哪个?

8qgya5xd  于 2023-02-26  发布在  其他
关注(0)|答案(3)|浏览(240)

我刚刚开始使用JacksonJSON库。Jackson是一个非常强大的库,但它有一个非常广泛的API。很多事情可以通过多种方式完成。这使得你很难在Jackson中找到自己的方式--如何知道什么是正确/最好的做事方式?
我为什么要使用此解决方案:

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readValue(json, JsonNode.class);
if (node.isObject()) {
    ObjectNode obj = mapper.convertValue(node, ObjectNode.class);
    if (obj.has("a")) {
        System.out.println("a=" + obj.get("a").asDouble());
    }
}

像这样的解决方案:

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);
if (node.isObject()) {
    ObjectNode obj = (ObjectNode) node;
    if (obj.has("a")) {
        System.out.println("a=" + obj.get("a").asDouble());
    }
}

或者是我使用JsonFactory和JsonParser遇到的解决方案,甚至可能是更多的选项...
在我看来,mapper.readValue是最通用的,可以在很多情况下使用:读取到JsonNode、ObjectNode、ArrayNode、PoJo等。那么,我为什么要使用mapper.readTree呢?
将JsonNode转换为ObjectNode的最佳方法是什么?只是强制转换为ObjectNode?还是使用类似mapper.convertValue的方法?

6rqinv9w

6rqinv9w1#

readValue()可用于任何类型和所有类型,包括JsonNode。readTree()仅适用于JsonNode(树模型);并且为了方便而添加。
请注意,您永远不想使用第一个示例:它相当于将节点写成JSON,然后再阅读回来--只需要强制转换即可。

a11xaf1n

a11xaf1n2#

读取值可以用于您自己的java类:

public class Foo {
   private int a;
   private String b;
   private double[] c;

   // getters/setters
}

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}";
ObjectMapper mapper = new ObjectMapper();
Foo foo = mapper.readValue(json, Foo.class);

例如,当您不知道对象的确切类型时,可以选择readTree;当您确定对象类型时,可以选择readValue

w3nuxt5m

w3nuxt5m3#

使用readTree()并使用JsonNode对象编写手动解析器,与使用readValue()(如果您使用直接序列化到POJO)相比,可以提供更快的运行时间
使用readTree()的其他好处:在解析ArrayNode对象时可以使用流并行,这将提高多核处理器上的运行时。
另一方面,如果使用readValue()解析JSON以MapType Reference(如HashMap〈String,String〉),它将比readTree()

Auto parsing raw map with ObjectMapper readValue runtime: 34 ms
Auto parsing type reference map with ObjectMapper readValue runtime: 6 ms
Auto parsing POJO with ObjectMapper readValue runtime: 51 ms
Manual sequential parsing with ObjectMapper readTree runtime: 18 ms
Manual stream parallel parsing with ObjectMapper readTree runtime: 10 ms

我在这里完成了示例和测试:
https://github.com/EvgenyUmansky/java-json-xml-processing/blob/master/src/test/java/JacksonTest.java
另一项测试:
https://gist.github.com/varren/3b7468a1d7abadad4958fe6bd7d42d44

相关问题