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
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\"}");
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 .
Eine dritte Variante:
ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readValue("{\"k1\":\"v1\"}", JsonNode.class);
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.
import com.github.fge.jackson.JsonLoader;
JsonLoader.fromString("{\"k1\":\"v1\"}")
== JsonNode = {"k1":"v1"}