251

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

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

4

6 回答 6

401

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

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"k1\":\"v1\"}");
于 2012-03-07T10:19:45.483 回答
71

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

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

于 2010-09-06T20:20:44.347 回答
31

第三种变体:

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);
于 2012-07-20T14:50:13.123 回答
5

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

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

于 2010-09-07T02:04:35.830 回答
3
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}
于 2014-10-01T23:01:22.670 回答
2

旧问题的新方法。适用于 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);
于 2020-06-24T18:03:28.967 回答