Come fare il parsing di una stringa JSON in JsonNode a Jackson?
Domanda
Dovrebbe essere così semplice, ma io proprio non riesco a trovarlo dopo essere stato provato per un #embarrasing un'ora.
Ho bisogno di ottenere una stringa JSON, ad esempio, {"k1":v1,"k2":v2}
, analizzato come JsonNode
.
JsonFactory factory = new JsonFactory();
JsonParser jp = factory.createJsonParser("{\"k1\":\"v1\"}");
JsonNode actualObj = jp.readValueAsTree();
dà
java.lang.IllegalStateException: No ObjectCodec defined for the parser, can not deserialize JSON into JsonNode tree
Soluzione
Una leggera variante risposta Richards ma readTree
può prendere una stringa in modo da poter semplificare a:
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree("{\"k1\":\"v1\"}");
Altri suggerimenti
È necessario utilizzare 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);
Ulteriore documentazione sulla creazione di parser può essere trovato qui .
Una terza variante:
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);
La risposta di Richard è corretta. In alternativa è anche possibile creare un MappingJsonFactory
(in org.codehaus.jackson.map
), che sa dove trovare ObjectMapper
. L'errore che si ottenne fu perché il JsonFactory
regolare (dalla confezione core
) non ha alcuna dipendenza ObjectMapper
(che è nel pacchetto mapper
).
Ma di solito basta usare ObjectMapper
e non ti preoccupare JsonParser
o di altri componenti di basso livello -. Saranno solo necessari se si vuole data-bind parti del flusso, o fare la gestione di basso livello
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}