如何在杰克逊中将JSON字符串解析为JsonNode?

fad*_*maa 221 java parsing json jackson

它应该是如此简单,但我在尝试一小时#embarrasing后找不到它.

我需要获取一个JSON字符串,例如{"k1":v1,"k2":v2},解析为JsonNode.

JsonFactory factory = new JsonFactory();
JsonParser jp = factory.createJsonParser("{\"k1\":\"v1\"}");
JsonNode actualObj = jp.readValueAsTree();
Run Code Online (Sandbox Code Playgroud)

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

sla*_*ick 356

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

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"k1\":\"v1\"}");
Run Code Online (Sandbox Code Playgroud)

  • 对于任何需要`ObjectNode`而不是`JsonNode`的人来说,使用`mapper.valueToTree("{\"k1 \":\"v1 \"}") (41认同)
  • @MatthewHerbst在2.5.1中,这将创建一个带有字符串"{\"k1 \":\"v1 \"}"的新文本节点,而不是将其解析为JSON. (5认同)

Ric*_*arn 69

你需要使用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);
Run Code Online (Sandbox Code Playgroud)

有关创建解析器的更多文档,请参见此处.


qer*_*rub 27

第三种变体:

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

  • @David:没什么,所以如果你只想要一个`JsonNode`,那么slashnick的变种显然会更好.但是,你通常不想要一个`JsonNode`,所以我想展示如何告诉Jackson你想要什么样的价值. (3认同)

Sta*_*Man 5

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

但通常你只是使用ObjectMapper而不用担心JsonParser或其他低级组件 - 如果你想要数据绑定流的一部分,或者进行低级处理,就会需要它们.


pdx*_*eif 5

import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}
Run Code Online (Sandbox Code Playgroud)