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

问题描述 投票:0回答:7

本来就这么简单,但是我试了一个小时还是找不到。

我需要获取一个 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

java json parsing jackson
7个回答
426
投票

与理查兹的答案略有不同,但

readTree
可以采用字符串,因此您可以将其简化为:

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

73
投票

您需要使用

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);

有关创建解析器的更多文档可以在此处找到。


32
投票

第三种变体:

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

5
投票

理查德的答案是正确的。或者,您也可以创建一个

MappingJsonFactory
(在
org.codehaus.jackson.map
中),它知道在哪里可以找到
ObjectMapper
。您得到的错误是因为常规
JsonFactory
(来自
core
包)不依赖于
ObjectMapper
(位于
mapper
包中)。

但通常您只使用

ObjectMapper
并且不用担心
JsonParser
或其他低级组件 - 如果您想要对流的部分数据进行数据绑定或进行低级处理,则只需要它们。


5
投票
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}

4
投票

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

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

对于复杂对象来说更具可读性和可维护性。埃杰

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);

0
投票

在科特林中:

import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue

val data = ObjectMapper().readValue<JsonNode>("{\"field\":\"value\"}")
© www.soinside.com 2019 - 2024. All rights reserved.