Konvertieren Sie JsonNode in POJO

Lesezeit: 4 Minuten

Benutzer-Avatar
Alexandre

Das mag etwas ungewöhnlich erscheinen, aber ich suche nach einer effizienten Möglichkeit, a JsonNode in ein POJO.

Ich speichere einige Informationen meines Modells in JSON-Dateien und muss einige Versionen meines Modells unterstützen.

Ich lade die JSON-Datei in einen JsonNode in den Speicher und wende ein paar Versionierungsstrategien an, damit sie mit der neuesten Version meines Modells übereinstimmt.

    ObjectMapper mapper = new ObjectMapper();
    BufferedReader fileReader = new BufferedReader(new FileReader(projPath));

    JsonNode rootNode = mapper.readTree(fileReader);

    //Upgrade our file in memory
    applyVersioningStrategy(rootNode);

    ProjectModel project = mapJsonNodeToProject(rootNode);

Wenn es keinen schnelleren Weg gibt, werde ich wahrscheinlich einfach manuell die Anwendung anwenden JsonNodes zu meinem Modell

Benutzer-Avatar
Eisbäume

In Jackson 2.4 können Sie wie folgt konvertieren:

MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);

wo jsonObjectMapper ist ein Jackson ObjectMapper.


In älteren Versionen von Jackson wäre es so

MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);

  • Leider gibt es keine treeToValue(TreeNode n,TypeReference type) Variante wie bei readValue(). Schlechte Nachrichten für alle, die sich mit komplexeren Typen mit Generika befassen 🙁

    – Espinosa

    5. Oktober 2016 um 17:28 Uhr

  • @Espinosa Per jackson-databind#1294möchten Sie so etwas wie (leider ausführlicher) jsonObjectMapper.readValue(jsonObjectMapper.treeAsTokens(someJsonNode), someTypeReference)

    – M. Justin

    27. Juni 2017 um 5:02 Uhr


  • Verwenden Sie für ältere Versionen: objectMapper.treeToValue(jsonNode, MyClass.class)

    – mod

    24. Januar 2018 um 17:42 Uhr

  • Sie können diese Methode auch in StdDeserializer verwenden: p.codec.treeToValue.

    – galcyurio

    28. Mai 2018 um 17:10 Uhr


  • @icedtrees jsonObjectMapper ist eine Instanz von JsonObjectMapper oder einfach nur der ObjectMapper

    – KNDheeraj

    22. Mai 2019 um 11:47 Uhr

Benutzer-Avatar
Eric Barr

Das sollte den Trick machen:

mapper.readValue(fileReader, MyClass.class);

Ich sage sollte, weil ich das mit a verwende Stringkein BufferedReader aber es sollte trotzdem funktionieren.

Hier ist mein Code:

String inputString = // I grab my string here
MySessionClass sessionObject;
try {
    ObjectMapper objectMapper = new ObjectMapper();
    sessionObject = objectMapper.readValue(inputString, MySessionClass.class);

Hier ist die offizielle Dokumentation für diesen Anruf: http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(java.lang.String, java.lang.Class)

Sie können auch einen benutzerdefinierten Deserializer definieren, wenn Sie die instanziieren ObjectMapper:
http://wiki.fasterxml.com/JacksonHowToCustomDeserializers

Edit: Mir ist gerade noch was eingefallen. Wenn Ihr eingehendes Objekt mehr Eigenschaften als die hat POJO hat und Sie die Extras einfach ignorieren möchten, sollten Sie dies einstellen:

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Oder Sie erhalten eine Fehlermeldung, dass die zu setzende Eigenschaft nicht gefunden werden kann.

  • Ich werde einen CustomDeserializer verwenden, das wird mir eine Menge Kopfschmerzen ersparen! Ich werde auch in der Lage sein, meine Versionierungsstrategien dort mit sehr kleinen Änderungen anzuwenden. Vielen Dank!

    – Alexandre

    31. Oktober 2013 um 17:03 Uhr

  • Die Syntax lautet jetzt: com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper(); mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

    – gx0r

    25. September 2014 um 22:18 Uhr

  • Guter Punkt @llamba! Ich habe den ObjectMapper seit Version 1.7.9 nicht mehr berührt, es sieht so aus, als wäre meine Antwort um einige Versionen veraltet. Überprüfen Sie auf jeden Fall, welche Version von Jackson Sie verwenden.

    – Eric Barr

    2. Oktober 2014 um 17:08 Uhr

  • @EricBarr, ich verwende Jackson v1.9.11 und die Syntax in Ihrer Antwort ist die richtige für diese Version. Vielleicht haben sie versucht, Dinge zu ändern und sie in den neueren Versionen wieder zurückgesetzt

    – Ivaylo Slavov

    23. Oktober 2014 um 7:23 Uhr

Wenn Sie org.codehaus.jackson verwenden, ist dies seit 1.6 möglich. Sie können einen JsonNode in einen POJO konvertieren mit ObjectMapper#readValue: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(org.codehaus.jackson.JsonNodejava.lang.Klasse)


    ObjectMapper mapper = new ObjectMapper();
    JsonParser jsonParser = mapper.getJsonFactory().createJsonParser("{\"foo\":\"bar\"}");
    JsonNode tree = jsonParser.readValueAsTree();
    // Do stuff to the tree
    mapper.readValue(tree, Foo.class);

  • Diese Methode scheint in 2.4.4 zu fehlen

    – Kevin Wittek

    21. Januar 2015 um 12:17 Uhr

  • Siehe die Antwort von icedtrees unten für eine Lösung der Version 2

    – Tim Büthe

    4. März 2015 um 14:56 Uhr


  • Die Dokumentation ist jetzt bei fasterxml.github.io/jackson-databind/javadoc/2.5/com/fasterxml/…

    – David Tonhofer

    13. September 2017 um 17:15 Uhr

String jsonInput = "{ \"hi\": \"Assume this is the JSON\"} ";
com.fasterxml.jackson.databind.ObjectMapper mapper =
    new com.fasterxml.jackson.databind.ObjectMapper();
MyClass myObject = objectMapper.readValue(jsonInput, MyClass.class);

Wenn Ihre JSON-Eingabe mehr Eigenschaften hat als Ihr POJO und Sie die Extras in Jackson 2.4 einfach ignorieren möchten, können Sie Ihren ObjectMapper wie folgt konfigurieren. Diese Syntax unterscheidet sich von älteren Jackson-Versionen. (Wenn Sie die falsche Syntax verwenden, wird es stillschweigend nichts tun.)

mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNK‌​NOWN_PROPERTIES);

Dies ist auch ein anderer Weg und kann für ein Array von Objekten verwendet werden

ObjectReader reader = mapper.readerFor(new TypeReference<List<SomeClass>>() {
});
assert someJsonNode.isArray()
List<SomeClass> list = reader.readValue(someJsonNode);

1352370cookie-checkKonvertieren Sie JsonNode in POJO

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy