readValue and readTree in Jackson:什么时候使用哪个?

2022-09-01 08:56:27

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

为什么我会使用这个解决方案:

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这样的东西?


答案 1

readValue() 可用于任何和所有类型,包括 .readTree() 仅适用于 (树模型);并添加是为了方便。JsonNodeJsonNode

请注意,您永远不想使用第一个示例:它相当于将节点写出为JSON,然后将其读回 - 只需将其强制转换即可。


答案 2

读取值可用于您自己的 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);

即,当您不知道对象的确切类型时,以及当您确定对象类型时,您可以选择。readTreereadValue