2012-04-11 12 views
14

Właśnie zaczynam używać biblioteki Jackson JSON. Jackson jest bardzo potężną biblioteką, ale ma niesamowicie rozbudowany interfejs API. Wiele rzeczy można zrobić na wiele sposobów. To sprawia, że ​​trudno znaleźć drogę w Jackson - jak się dowiedzieć, jaki jest właściwy/najlepszy sposób robienia rzeczy?readValue i readTree w Jackson: kiedy użyć?

Dlaczego chciałbym używać tego rozwiązania:

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

ciągu takiego rozwiązania:

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

Albo nad rozwiązaniami, które natknąłem użyciu JsonFactory i JsonParser a może nawet więcej opcji ...

Wydaje mi się, że mapper.readValue jest najbardziej ogólna i może być używana w wielu przypadkach: czytaj do JsonNode, ObjectNode, ArrayNode, PoJo, itd. Więc dlaczego miałbym chcieć nas e mapper.readTree?

Jaki jest najlepszy sposób na konwersję JsonNode do ObjectNode? Wystarczy rzucić na ObjectNode? Lub użyć czegoś takiego jak mapper.convertValue?

Odpowiedz

12

Metoda readValue() może być używana dla wszystkich typów, w tym JsonNode. readTree() działa tylko dla JsonNode (model drzewa); i jest dodawany dla wygody.

Pamiętaj, że NIGDY nie chcesz używać swojego pierwszego przykładu: jest to równoważne z wypisaniem twojego węzła jako JSON, a następnie odczytaniem go - po prostu rzuć go.

+0

dzięki, to przydatne informacje. Zakładałem, że convertValue jest na tyle sprytny, że można go rzucać do właściwego typu, o ile to możliwe, i że będzie bezpieczniejsze niż sam casting ... –

+1

To ciekawy pomysł - może taki kod mógł zostać dodany? Nazwa "konwertuj" ma na celu przekazanie konwersji; nie po prostu rzucać, ale myślę, że to nie jest nierozsądne oczekiwanie. Złożę dla tego problem ulepszenia. – StaxMan

4

odczytać wartość można wykorzystać dla własnych klas 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); 

Tj readTree możesz wybrać, kiedy nie masz dokładnego typu obiektu. podczas gdy readValue - kiedy znasz typ obiektu na pewno.

+0

Rzeczywiście, jest to jedna z rzeczy, która czyni readValue użytecznym w sytuacjach amore niż readTree, więc dlaczego warto wybrać readTree zamiast readValue? –

+0

readTree możesz wybrać, gdy nie masz dokładnego typu obiektu. while readValue - gdy znasz typ obiektu na pewno. –

Powiązane problemy