36 Stimmen

ReadValue und readTree in Jackson: wann soll man welches verwenden?

Ich habe gerade angefangen, die Jackson JSON-Bibliothek zu verwenden. Jackson ist eine sehr leistungsstarke Bibliothek, aber sie hat eine schrecklich umfangreiche API. Vieles kann auf verschiedene Arten erledigt werden. Dies macht es schwierig, sich in Jackson zurechtzufinden - wie weiß man, was der korrekte/beste Weg ist, um Dinge zu tun?

Warum sollte ich diese Lösung verwenden:

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readValue(json, JsonNode.class);
if (node.isObject()) {
    ObjectNode obj = mapper.convertValue(node, ObjectNode.class);
    if (obj.has("a")) {
        System.out.println("a=" + obj.get("a").asDouble());
    }
}

Über eine Lösung wie diese:

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(json);
if (node.isObject()) {
    ObjectNode obj = (ObjectNode) node;
    if (obj.has("a")) {
        System.out.println("a=" + obj.get("a").asDouble());
    }
}     

Oder über Lösungen, die ich gefunden habe, die JsonFactory und JsonParser verwenden und vielleicht sogar mehr Optionen...

Es scheint mir, dass mapper.readValue am allgemeinsten ist und in vielen Fällen verwendet werden kann: Lesen zu JsonNode, ObjectNode, ArrayNode, PoJo, etc. Warum sollte ich also mapper.readTree verwenden?

Und was ist der beste Weg, um ein JsonNode in ein ObjectNode umzuwandeln? Einfach zu ObjectNode casten? Oder etwas wie mapper.convertValue verwenden?

29voto

StaxMan Punkte 107669

ReadValue() kann für alle Arten von Typen verwendet werden, einschließlich JsonNode. readTree() funktioniert nur für JsonNode (baumartiges Modell); und wird aus Bequemlichkeit hinzugefügt.

Beachten Sie, dass Sie NIEMALS Ihr erstes Beispiel verwenden möchten: Es entspricht dem Ausschreiben Ihres Knotens als JSON und anschließendem erneutem Lesen - einfach umwandeln.

14voto

Eugene Retunsky Punkte 12771

Der Lesevorgang kann für Ihre eigenen Java-Klassen verwendet werden:

public class Foo {
   private int a;
   private String b;
   private double[] c;

   // getters/setters
}

String json = "{\"a\":2, \"b\":\"a string\", \"c\": [6.7, 6, 5.6, 8.0]}";
ObjectMapper mapper = new ObjectMapper();
Foo foo = mapper.readValue(json, Foo.class);

d.h. Sie können readTree wählen, wenn Sie den genauen Typ des Objekts nicht kennen, und readValue, wenn Sie den Objekttyp sicher wissen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X