我刚刚开始使用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的方法?
3条答案
按热度按时间6rqinv9w1#
readValue()可用于任何类型和所有类型,包括
JsonNode
。readTree()仅适用于JsonNode
(树模型);并且为了方便而添加。请注意,您永远不想使用第一个示例:它相当于将节点写成JSON,然后再阅读回来--只需要强制转换即可。
a11xaf1n2#
读取值可以用于您自己的java类:
例如,当您不知道对象的确切类型时,可以选择
readTree
;当您确定对象类型时,可以选择readValue
。w3nuxt5m3#
使用readTree()并使用JsonNode对象编写手动解析器,与使用readValue()(如果您使用直接序列化到POJO)相比,可以提供更快的运行时间。
使用readTree()的其他好处:在解析ArrayNode对象时可以使用流并行,这将提高多核处理器上的运行时。
另一方面,如果使用readValue()解析JSON以MapType Reference(如HashMap〈String,String〉),它将比readTree()快。
我在这里完成了示例和测试:
https://github.com/EvgenyUmansky/java-json-xml-processing/blob/master/src/test/java/JacksonTest.java
另一项测试:
https://gist.github.com/varren/3b7468a1d7abadad4958fe6bd7d42d44