2012-04-11 2 views
14

Ich fange gerade an, die Jackson JSON Bibliothek zu benutzen. Jackson ist eine sehr mächtige Bibliothek, aber es hat eine schrecklich umfangreiche API. Viele Dinge können auf verschiedene Arten getan werden. Das macht es schwer, sich in Jackson zurecht zu finden - wie kann man wissen, was der richtige/beste Weg ist?readValue und readTree in Jackson: wann welche verwenden?

Warum sollte ich diese Lösung:

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 folgt aus:

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 stieß auf mit JsonFactory und JsonParser und vielleicht sogar noch mehr Optionen ...

Es scheint mir, dass mapper.readValue ist am allgemeinsten und kann in vielen Fällen verwendet werden: lesen Sie zu JsonNode, ObjectNode, ArrayNode, PoJo, etc. Also warum sollte ich zu uns wollen e mapper.readTree?

Und was ist der beste Weg, um einen JsonNode in einen ObjectNode zu konvertieren? Einfach in den ObjectNode umwandeln? Oder verwenden Sie etwas wie mapper.convertValue?

Antwort

12

readValue() kann für alle Typen verwendet werden, einschließlich JsonNode. readTree() funktioniert nur für JsonNode (Baummodell); und wird für die Bequemlichkeit hinzugefügt.

Beachten Sie, dass Sie NIEMALS Ihr erstes Beispiel verwenden möchten: es entspricht dem Schreiben Ihres Knotens als JSON, dann lesen Sie es zurück - einfach umwandeln.

+0

Danke, das sind nützliche Informationen. Ich nahm an, dass convertValue schlau genug war, um so einfach wie möglich auf den richtigen Typ zu tippen, und dass es sicherer wäre als mich selbst zu werfen ... –

+1

Das ist eine interessante Idee - vielleicht könnte ein solcher Code hinzugefügt werden? Name 'convert' soll Konversion vermitteln; nicht einfach zu werfen, aber ich denke, es ist keine unvernünftige Erwartung. Ich werde ein Verbesserungsproblem dafür einreichen. – StaxMan

4

lesen Wert kann für die eigene 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. readTree Sie können wählen, wenn Sie nicht den genauen Typ des Objekts. während readValue - wenn Sie den Objekttyp sicher kennen.

+0

In der Tat, das ist einer der Dinge, die readValue in amore Situationen als readTree verwendbar macht, also warum überhaupt readTree über readValue wählen? –

+0

readTree Sie können wählen, wenn Sie nicht den genauen Typ des Objekts. while readValue - wenn Sie den Objekttyp sicher kennen. –

Verwandte Themen