jackson的readValue和readTree:何时使用哪个?

我刚刚开始使用Jackson JSON库。 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这样的东西?

readValue()可用于任何和所有类型,包括JsonNode 。 readTree()仅适用于JsonNode (树模型); 并为方便起见而添加。

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

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

也就是说,当你没有确切的对象类型时,你可以选择。 而readValue – 当你确定知道对象类型时。