Как разбирать строку JSON в JsonNode в Джексоне?

Это должно быть так просто, но я просто не могу найти его, пробовав чаС#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

Ответ 1

Небольшое отклонение от ответа Ричардса, но readTree может взять строку, чтобы упростить ее:

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

Ответ 2

Вам нужно использовать 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);

Ответ 3

Третий вариант:

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

Ответ 4

Ответ Ричард правильный. В качестве альтернативы вы также можете создать MappingJsonFactoryorg.codehaus.jackson.map), который знает, где найти ObjectMapper. Вы получили ошибку, потому что обычный JsonFactory (из пакета core) не имеет отношения к ObjectMapper (который находится в пакете mapper).

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

Ответ 5

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