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