Как разобрать строку JSON в JsonNode в Jackson?

это должно быть так просто, но я просто не могу найти его после попытки в течение часа #конфузить.

мне нужно получить строку 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

5 ответов


небольшое изменение ответа Ричардса, но 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 (in org.codehaus.jackson.map), который знает, где найти ObjectMapper. Ошибка, которую вы получили, была потому, что обычный JsonFactory (от core package) не имеет зависимости от ObjectMapper (который находится в mapper пакет).

но обычно вы просто использовать ObjectMapper и не беспокойтесь о JsonParser или другие низкоуровневые компоненты -- они как раз будут необходимы если вы хотите Данн-связывать части потока, или делаете низкоуровневую обработку.


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