2012-07-16 21 views
12

JSON dosyalarını ayrıştırmak için bir Android projesinde Jackson 1.9.5 kullanıyorum.Jackson ObjectMapper, keyfi JSON tuşları ile

Şimdiye kadar herhangi bir sorun olmadı ve ince Aşağıdaki kodu kullanarak dosyaları ayrıştırabilirsiniz: DetailSchema sınıf ilkel türleri ve sınıfları bir karışımı oluşur

AssetManager mgr = getAssets(); 
ObjectMapper mapper = new ObjectMapper(); 

try { 
    InputStream ifp = mgr.open("detail_schema.json"); 
    schema = mapper.readValue(ifp, DetailSchema.class); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

. Şimdi aşağıdaki gibi bazı JSON ayrıştırmak istediğiniz bir problem haline çalıştırıyorum:

muhtemelen elden önce harita anahtarlarını bilemez
"fields": { 
    "Suburb": "Paddington", 
    "State": "NSW", 
    "Post Code": "2074", 
    "Lollipop": "Foo Bar Haz" 
} 

(onlar kullanıcı tanımlı olabilir). Bu nedenle, ilişkili Java sınıfının neye benzediğinden emin değilim.

Yani, bu örneğin, gibi görünebilir:

public class MyClass { 

    public String Suburb; 
    public String State; 
    public String PostCode; 
    public String Lollipop; 

} 

Ama bu JSON dosyasına başka örneği için doğru olmayabilir. İdeal olarak, Jackson'ın değerleri NameValuePair gibi bir şeye eşlemesi için bir yola ihtiyacım var. Otomatik nesne eşlemenin bu durumda bir seçenek olmayacağından şüpheleniyorum - birisi bunu onaylayabilir mi, reddedebilir mi?

cevap

16

İki seçeneğiniz var. JsonNode'u döndüren readTree in ObjectMapper'u kullanabilirsiniz.

InputStream ifp = mgr.open("detail_schema.json"); 
JsonNode root = mapper.readTree(ifp); 
JsonNode fields = root.get("fields"); 
for (JsonNode children : fields.getElements()) { 
    // ... 
} 

Ardından el DetailSchema nesne oluşturmak gerekir: Eğer, çocuk düğümleri almak değerleri okumak, vesaire böylece bir JsonNode ile çalışarak, çok bir ağaç ile çalışan gibidir.

Veya, Jackson kodunuzu kullanmak istiyorum bu durumda bir harita olarak bu serisini sağlayabilirsiniz ama Sınıfım böyle nereye olurdu:

public class MyClass { 
    public Map<String, Object> fields; 

    // getter/setters 
} 

Muhtemelen olarak String gibi harita değerlerini yazabilirsiniz Girişlerin jsonda metin olduğundan eminseniz iyi olur. (Aslında, ne tür yaptırım Jackson yapar emin değilim, belki yine de bir şey izin verecek ...)

+1

Büyük teşekkürler! Bir Harita benim amacım için iyi çalışır. – aaronsnoswell

+0

Aslında bir "Harita" almak için özel bir sınıf kullanmak zorunda değilsiniz, Jackson 'Map' arabiriminin bir uygulamasına doğrudan seriyi atayabilirsiniz, örneğin:' Harita jsonFields = mapper.readValue (ifp, HashMap .class) ' – brianmearns

İlgili konular