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();

  

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

È stato utile?

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"}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top