2012-04-11 7 views
14

Sto appena iniziando ad usare la libreria Jackson JSON. Jackson è una libreria molto potente, ma ha un'API terribilmente estesa. Molte cose possono essere fatte in molti modi. Ciò rende difficile trovare la tua strada in Jackson - come sapere qual è il modo corretto/migliore di fare le cose?readValue e readTree in Jackson: quando usare quale?

Perché dovrei utilizzare questa soluzione:

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()); 
    } 
} 

Nel corso di una soluzione di questo tipo:

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()); 
    } 
}  

O rispetto alle soluzioni che mi sono imbattuto con JsonFactory e JsonParser e forse ancora più opzioni ...

Sembra mee che mapper.readValue sia più generico e può essere utilizzato in molti casi: leggere JsonNode, ObjectNode, ArrayNode, PoJo, ecc. Quindi, perché dovrei volerci e mapper.readTree?

E qual è il modo migliore per convertire un JsonNode in un ObjectNode? Trasmetti semplicemente su ObjectNode? O usare qualcosa come mapper.convertValue?

risposta

12

readValue() può essere utilizzato per qualsiasi tipo, incluso JsonNode. readTree() funziona solo per JsonNode (modello ad albero); e viene aggiunto per comodità.

Nota che non vuoi MAI utilizzare il tuo primo esempio: equivale a scrivere il tuo nodo come JSON, quindi a leggerlo di nuovo - basta lanciarlo.

+0

grazie, questa è un'informazione utile. Supponevo che convertValue fosse abbastanza intelligente da trasmettere il tipo corretto quando possibile e che sarebbe più sicuro di me stesso ... –

+1

Questa è un'idea interessante - forse un tale codice potrebbe essere aggiunto? Il nome 'convert' è pensato per trasmettere la conversione; non semplicemente cast, ma immagino che non sia un'aspettativa irragionevole. Presenterò un problema di miglioramento per questo. – StaxMan

4

Leggi valore può essere utilizzato per le proprie classi Java:

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

Vale a dire readTree puoi scegliere quando non hai il tipo esatto dell'oggetto. while readValue - quando si conosce il tipo di oggetto di sicuro.

+0

In effetti, questa è una delle cose che rende readValue utilizzabile in situazioni d'amore di readTree, quindi perché mai scegliere readTree su readValue? –

+0

readTree puoi scegliere quando non hai il tipo esatto dell'oggetto. while readValue - quando si conosce il tipo di oggetto di sicuro. –