它应该是如此简单,但是我只是在尝试一个小时#embarrass后就找不到它。

例如,我需要得到一个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

有帮助吗?

解决方案

理查兹答案有轻微的变化 readTree 可以采用一个字符串,因此您可以将其简化为:

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

其他提示

您需要使用 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);

可以找到有关创建解析器的进一步文档 这里.

第三个变体:

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

理查德的答案是正确的。或者,您也可以创建一个 MappingJsonFactory (在 org.codehaus.jackson.map)知道在哪里可以找到 ObjectMapper. 。您遇到的错误是因为常规 JsonFactory (从 core 包)没有依赖性 ObjectMapper (在 mapper 包裹)。

但是通常您只是使用 ObjectMapper 不用担心 JsonParser 或其他低级组件 - 如果您想了解流的数据结合部分或进行低级处理,则只需要它们即可。

import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top