it-swarm.com.ru

Как разобрать строку 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

214
fadmaa

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

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

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

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

68
Richard Fearn

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

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

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

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

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