Debería ser tan simple, pero no puedo encontrarlo después de haberlo intentado durante una hora.
Necesito obtener una cadena JSON, por ejemplo {"k1":v1,"k2":v2}
, analizada como a 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
#embarrasing
- no Si las cosas simples no son simples, entonces el diseñador de la API ha fallado, no tú.Respuestas:
Una ligera variación en la respuesta de Richards, pero
readTree
puede tomar una cadena para que pueda simplificarla a:fuente
ObjectNode
lugar de unJsonNode
usomapper.valueToTree("{\"k1\":\"v1\"}")
Necesitas usar un
ObjectMapper
:Puede encontrar más documentación sobre la creación de analizadores aquí .
fuente
mapper.treeToValue()
. PeroreadValue()
también funciona.Una tercera variante:
fuente
JsonNode
. Sin embargo, por lo general no quieres unJsonNode
, así que quería mostrarte cómo decirle a Jackson qué tipo de valor quieres.JsonNode
aparentemente era necesario pasar para evitar que Jackson lo deserializara como algo más, lo que habría fallado.La respuesta de Richard es correcta. Alternativamente, también puede crear un
MappingJsonFactory
(inorg.codehaus.jackson.map
) que sepa dónde encontrarObjectMapper
. El error que obtuvo fue porque el regularJsonFactory
(delcore
paquete) no tiene dependenciaObjectMapper
(que está en elmapper
paquete).Pero generalmente solo usa
ObjectMapper
y no se preocupa porJsonParser
otros componentes de bajo nivel; solo serán necesarios si desea unir partes de datos de la transmisión o hacer un manejo de bajo nivel.fuente
fuente
Nuevo enfoque a la vieja pregunta. Una solución que funciona desde java 9+
es más legible y mantenible para objetos complejos. Ej
fuente