我刚开始使用Jackson JSON库。杰克逊是一个非常强大的库,但它有一个非常广泛的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?
这样的东西答案 0 :(得分:18)
readValue()可用于任何和所有类型,包括JsonNode
。 readTree()仅适用于JsonNode
(树模型);并为方便起见而添加。
请注意,您永远不想使用您的第一个示例:它等同于将您的节点写为JSON,然后将其读回 - 只需将其投射。
答案 1 :(得分:9)
读取值可用于您自己的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
。