Cómo analizar una cadena JSON en JsonNode en Jackson?


Debería ser tan simple, pero simplemente no puedo encontrarlo después de estar intentándolo durante una hora #avergonzando.

Necesito obtener una cadena JSON, por ejemplo, {"k1":v1,"k2":v2}, analizada como JsonNode.

JsonFactory factory = new JsonFactory();
JsonParser jp = factory.createJsonParser("{\"k1\":\"v1\"}");
JsonNode actualObj = jp.readValueAsTree();

Da

java.lang.IllegalStateException: No ObjectCodec defined for the parser, can not deserialize JSON into JsonNode tree

Author: Peter Mortensen, 2010-09-06

5 answers

Una ligera variación en la respuesta de Richards pero readTree puede tomar una cadena para que pueda simplificarla a:

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"k1\":\"v1\"}");
 326
Author: slashnick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-03 20:37:03

Necesitas usar un 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);

Puede encontrar más documentación sobre la creación de analizadores aquí.

 64
Author: Richard Fearn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-28 15:39:32

Una tercera variante:

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);
 27
Author: qerub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-20 14:50:13

La respuesta de Richard es correcta. Alternativamente, también puede crear un MappingJsonFactory (en org.codehaus.jackson.map) que sabe dónde encontrar ObjectMapper. El error se debe a que el paquete regular JsonFactory (del paquete core) no tiene ninguna dependencia de ObjectMapper (que está en el paquete mapper).

Pero normalmente solo usa ObjectMapper y no se preocupe por JsonParser u otros componentes de bajo nivel just solo serán necesarios si desea enlazar partes de flujo de datos, o hacer un manejo de bajo nivel.

 5
Author: StaxMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-08 10:27:18
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}
 3
Author: pdxleif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-01 23:01:22