如何将 JSON 字符串解析为 Jackson 中的 JsonNode?

Posted

技术标签:

【中文标题】如何将 JSON 字符串解析为 Jackson 中的 JsonNode?【英文标题】:How to parse a JSON string into JsonNode in Jackson? 【发布时间】:2011-04-08 21:56:27 【问题描述】:

应该就是这么简单,可是我试了一个小时还是找不到。

我需要得到一个JSON字符串,例如"k1":v1,"k2":v2,解析为JsonNode

JsonFactory factory = new JsonFactory();
JsonParser jp = factory.createJsonParser("\"k1\":\"v1\"");
JsonNode actualObj = jp.readValueAsTree();

给予

java.lang.IllegalStateException: No ObjectCodec defined for the parser, can not deserialize JSON into JsonNode tree

【问题讨论】:

#embarrasing -- 不。如果简单的事情不简单,那么 API 设计者失败了,而不是你。 @StaxMan 在代码中的回答:JsonFactory factory = new MappingJsonFactory(); 【参考方案1】:

您需要使用ObjectMapper

ObjectMapper mapper = new ObjectMapper();
JsonFactory factory = mapper.getJsonFactory(); // since 2.1 use mapper.getFactory() instead
JsonParser jp = factory.createJsonParser("\"k1\":\"v1\"");
JsonNode actualObj = mapper.readTree(jp);

更多关于创建解析器的文档可以在here找到。

【讨论】:

是不是可以取JsonNode,稍微修改一下,然后调用mapper.readValue(node, class);出去上课? 是的。甚至还有一个别名mapper.treeToValue()。但是readValue() 也可以。 链接好像坏了【参考方案2】:

理查德的回答是正确的。或者,您也可以创建一个MappingJsonFactory(在org.codehaus.jackson.map 中),它知道在哪里可以找到ObjectMapper。你得到的错误是因为常规的JsonFactory(来自core 包)对ObjectMapper(在mapper 包中)没有依赖关系。

但通常您只使用ObjectMapper 而不必担心JsonParser 或其他低级组件——如果您想对流的部分数据进行数据绑定或进行低级处理,就需要它们。

【讨论】:

【参考方案3】:

Richards 的回答略有不同,但 readTree 可以采用字符串,因此您可以将其简化为:

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("\"k1\":\"v1\"");

【讨论】:

对于任何需要ObjectNode 而不是JsonNode 的人,请使用mapper.valueToTree("\"k1\":\"v1\"") @MatthewHerbst 在 2.5.1 中,这将创建一个带有字符串 "\"k1\":\"v1\"" 的新文本节点,而不是将其解析为 JSON。【参考方案4】:

第三种变体:

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("\"k1\":\"v1\"", JsonNode.class);

【讨论】:

传入 JsonNode.class 究竟是什么让你来到这里? @David:没什么,所以如果你只想要JsonNode,slashnick 的变体显然更好。然而,你通常不想要JsonNode,所以我想展示如何告诉杰克逊你想要什么样的价值。 对我来说,传递 JsonNode 显然是必要的,以防止 Jackson 将其反序列化为其他东西 - 这会失败。【参考方案5】:
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("\"k1\":\"v1\"")
== JsonNode = "k1":"v1"

【讨论】:

【参考方案6】:

旧问题的新方法。 适用于 java 9+ 的解决方案

ObjectNode agencyNode = new ObjectMapper().valueToTree(Map.of("key", "value"));

对于复杂对象更具可读性和可维护性。 Ej

Map<String, Object> agencyMap = Map.of(
        "name", "Agencia Prueba",
        "phone1", "1198788373",
        "address", "Larrea 45 e/ calligaris y paris",
        "number", 267,
        "enable", true,
        "location", Map.of("id", 54),
        "responsible", Set.of(Map.of("id", 405)),
        "sellers", List.of(Map.of("id", 605))
);
ObjectNode agencyNode = new ObjectMapper().valueToTree(agencyMap);

【讨论】:

以上是关于如何将 JSON 字符串解析为 Jackson 中的 JsonNode?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jackson 解析 JSON 数组项中的原始值?

将JSON转换为Java Object,如何使用Jackson解析BadgerFish约定

将json字符串解析为具有复杂数据结构的java(jackson)

一文吃透Json解析工具类合集(FastJsonJacksonGson)

如何在 Kotlin 中解析 JSON?

使用Jackson“意外令牌(START_OBJECT)使用LocalDateTime将JSON解析为POJO,预期VALUE_STRING:预期的数组或字符串。”