如何解析JSON字符串成JsonNode在杰克逊?

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

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

345889 次浏览

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

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

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

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

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

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

第三种变体:

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}

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