应该很简单,但是我找了一个小时还是找不到。

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

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

给了

java.lang.IllegalStateException:没有为解析器定义的ObjectCodec,不能将JSON反序列化为JsonNode树


当前回答

理查德的答案是正确的。或者,您也可以创建一个MappingJsonFactory(在org. codehauss .jackson.map中),它知道在哪里可以找到ObjectMapper。您得到的错误是因为常规的JsonFactory(来自核心包)不依赖于ObjectMapper(在映射器包中)。

但通常只使用ObjectMapper,而不用担心JsonParser或其他低级组件——只有在想要数据绑定流的某些部分或进行低级处理时才需要它们。

其他回答

你需要使用一个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. codehauss .jackson.map中),它知道在哪里可以找到ObjectMapper。您得到的错误是因为常规的JsonFactory(来自核心包)不依赖于ObjectMapper(在映射器包中)。

但通常只使用ObjectMapper,而不用担心JsonParser或其他低级组件——只有在想要数据绑定流的某些部分或进行低级处理时才需要它们。

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

与Richards的答案略有不同,但readTree可以接受一个字符串,所以你可以将其简化为:

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