webentwicklung-frage-antwort-db.com.de

Wie parse ich einen JSON-String in JsonNode in Jackson?

Es sollte so einfach sein, aber ich kann es einfach nicht finden, nachdem ich es eine Stunde lang versucht habe.

Ich brauche einen JSON-String, zum Beispiel {"k1":v1,"k2":v2}, analysiert als JsonNode.

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

gibt

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

218
fadmaa

Eine kleine Variation der Richards-Antwort, aber readTree kann eine Zeichenfolge enthalten, sodass Sie sie folgendermaßen vereinfachen können:

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

Sie müssen ein ObjectMapper verwenden:

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

Weitere Dokumentation zum Erstellen von Parsern finden Sie hier .

69
Richard Fearn

Eine dritte Variante:

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

Richards Antwort ist richtig. Alternativ können Sie auch ein MappingJsonFactory (in org.codehaus.jackson.map) der weiß, wo er ObjectMapper findet. Der Fehler, den Sie erhielten, war, weil das reguläre JsonFactory (von core -Paket) keine Abhängigkeit von ObjectMapper (das sich im mapper -Paket befindet) hat.

Aber normalerweise verwenden Sie nur ObjectMapper und machen sich keine Sorgen um JsonParser oder andere Komponenten auf niedriger Ebene - sie werden nur benötigt, wenn Sie Teile des Streams mit Daten binden möchten oder auf niedriger Ebene Handhabung.

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