Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson中的readValue和readTree:何时使用哪个?_Java_Json_Jackson - Fatal编程技术网

Java Jackson中的readValue和readTree:何时使用哪个?

Java Jackson中的readValue和readTree:何时使用哪个?,java,json,jackson,Java,Json,Jackson,我刚刚开始使用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

我刚刚开始使用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之类的工具?

读取值可用于您自己的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);
i、 e.当您不知道对象的确切类型时,您可以选择
readTree
,当您确定对象类型时,您可以选择
readValue

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


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

事实上,这是使readValue在比readTree更多的情况下可用的一个因素,那个么为什么要选择readTree而不是readValue呢?当并没有确切的对象类型时,可以选择readTree。while readValue-当您确定对象类型时。谢谢,这是有用的信息。我认为convertValue足够聪明,可以在可能的情况下转换为正确的类型,并且比转换我自己更安全……这是一个有趣的想法——也许可以添加这样的代码?名称“convert”表示转换;不是简单的演员,但我想这不是不合理的期望。我将为此提交一个改进问题。