Как разобрать строку JSON в JsonNode в Джексоне? - PullRequest
214 голосов
/ 06 сентября 2010

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

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

348 голосов
/ 07 марта 2012

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

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"k1\":\"v1\"}");
68 голосов
/ 07 сентября 2010

Вам необходимо использовать 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);

Дополнительную документацию по созданию синтаксических анализаторов можно найти здесь .

27 голосов
/ 20 июля 2012

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

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);
5 голосов
/ 07 сентября 2010

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

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

3 голосов
/ 02 октября 2014
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}
...