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

时间:2010-09-06 19:57:02

标签: java json parsing jackson

应该这么简单,但是在尝试了一个小时之后我就找不到它了#embarrasing。

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

6 个答案:

答案 0 :(得分:344)

Richards答案略有不同,但readTree可以使用字符串,因此您可以将其简化为:

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

答案 1 :(得分:68)

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

可以找到有关创建解析器的更多文档here

答案 2 :(得分:27)

第三种变体:

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

答案 3 :(得分:5)

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

但通常你只使用ObjectMapper而不用担心JsonParser或其他低级组件 - 如果你想要数据绑定流的部分,或者做低 - 只需要它们水平处理。

答案 4 :(得分:3)

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

答案 5 :(得分:1)

解决旧问题的新方法。 从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);