java - jackson : when to use which? 中的 readValue 和 readTree

标签 java json jackson

我刚刚开始使用 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 - jackson : when to use which? 中的 readValue 和 readTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10113512/

相关文章:

java - Jackson Joda 模块将 ISO 日期反序列化为 Joda DateTime

java - 使用 Jackson 反序列化从 .NET 生成的 JSON 字符串

java - 调用execute()时PreparedStatement与记录不匹配

java - 有没有办法根据包中的所有 java 源文件生成哈希值,然后在运行时在日志消息中使用该值?

java - PrintedPdfDocument bmp 转 pdf

java - 从 JAVA 中的多维 JSON 映射检索数据

java - 使用 Jackson 和 Json-View 排除 json 中的字段

java - Spring DI - 不要初始化所有依赖的 bean

javascript - 使用 JSON 文件中的数据制作模型的 Backbone 集合

javascript - 从数据库填充数据列表