2012-04-11 13 views
14

Sadece Jackson JSON kütüphanesini kullanmaya başladım. Jackson çok güçlü bir kütüphanedir, ancak oldukça kapsamlı bir API'ye sahiptir. Birçok şekilde birçok şey yapılabilir. Bu, Jackson'da yolunuzu bulmayı zorlaştırıyor - işlerin doğru/en iyi yolunun ne olduğunu nasıl bilebiliriz? Böyle bir çözelti içindereadValue and readTree in Jackson: ne zaman kullanılmalı?

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

:

Neden bu çözüm kullanırsınız

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

Ya çözümleri üzerinde

Ben JsonFactory ve JsonParser ve belki de daha fazla seçenekleri kullanarak rastladı ...

Bu mapper.readValue en genel olduğunu ve birçok durumda kullanılabilir: çünkü JsonNode, ObjectNode, ArrayNode, PoJo, vb okuyun. Neden bize istiyorum e mapper.readTree?

JsonNode'u bir ObjectNode'a dönüştürmenin en iyi yolu nedir? Sadece ObjectNode için döküm? Ya da mapper.convertValue gibi bir şey kullanın?

cevap

12

readValue(), JsonNode dahil olmak üzere her tür ve her tür için kullanılabilir. readTree() yalnızca JsonNode (ağaç modeli) için çalışır; kolaylık sağlamak için eklenmiştir.

İlk örneğinizi ASLA kullanmak istemediğinizi unutmayın: bu, düğümünüzü JSON olarak yazmakla eşdeğerdir, daha sonra geri okumaktır - sadece yayınlayın.

+0

teşekkürler, bu yararlı bir bilgidir. ConvertValue'nin mümkün olduğunda doğru tipte yayınlamak için yeterince akıllı olduğunu ve kendiminkinden daha güvenli olacağını düşündüm ... –

+1

Bu ilginç bir fikir - belki de böyle bir kod eklenebilir? 'Convert' ismi, dönüştürmeyi ifade etmek içindir; sadece döküm değil, ama sanırım mantıksız bir beklenti değil. Bunun için bir iyileştirme sorunu kaydedeceğim. – StaxMan

4

Okuma değeri kendi java sınıfları için kullanılabilir:

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

yani readTree, nesnenin tam olarak bir türü olmadığında seçebilirsiniz. readValue iken - nesne türünü bildiğinizden emin olun.

+0

Gerçekten de, readTree'den daha fazla amort durumlarında readValue işlevini kullanan şeylerden biri, bu yüzden neden readValue üzerinde readTree seçelim? –

+0

readTree Nesnenin hiçbir türü olmadığında seçebilirsiniz. readValue - nesne türünü bildiğinizden emin olun. –