2011-11-20 44 views
9

kullanarak JSON dizisinden gelen dizeleri geri almayı denediğime yakın olan birkaç yanıt buldum, ancak çalışmayı başarabildim. Bu örneğe benzeyen bir grup JSON'um var (yalnızca gerçekten birkaç seviye daha derin ve yüzlerce öğe ile erişmek istediğim düzeyde): {"query":{"pages":{"links":[{"word":"bobsyeruncle","code":4},{"word":"easyaspie","code":3}]}}}. Biçimi değiştiremiyorum; başka birinin API'sı. İhtiyacım olmayan pek çok şey var; Aslında sadece bir dizi ["bobsyeruncle", "easyaspie"] gibi bir şey istiyorum. (Veya bir liste veya her neyse.)Jackson

JSON'un bir dizisi olmayan daha basit bir sürümünü denedim ve rootNode.get ("query") kullanarak kolayca tek bir dizeye erişebildi. ("sayfalar") ... https://stackoverflow.com/questions/338586/a-better-java-json-library/338608#338608'da açıklanan yol. Ama diziyi bu şekilde alamadım. Burada bulduğum cevapların çoğunun, hem "kelime" hem de "kod" kelimelerini içeren "Bağlantılar" gibi bir POJO oluşturmak istediğimi varsayalım. İstediğim dizelere erişmek için, hem "word" hem de "code" kelimelerini içeren ve "code" u görmezden gelen "Linkler" listesi gibi bir şey yaratmak gerekli midir? Bu doğru görünmüyor.

(kimse belgelerine bana gelin Ayrıca,/yere JacksonInFiveMinutes öğretici ve bütün javadoc aradaki öğreticiler, bunu da yardımcı olacaktır eminim.) Bu çalıştı

ETA, ben !:

düşünüyorum
  String theJsonString = "{\"query\":{\"pages\":{\"links\":" 
       + "[{\"word\":\"bobsyeruncle\"},{\"word\":\"easyaspie\"}]}}}"; 
     ObjectMapper mapper = new ObjectMapper(); 
     JsonNode rootNode = mapper.readTree(theJsonString); 
     JsonNode interestingObjectNode = rootNode.path("query").path("pages").path("links"); 
     for (int i = 0; i < interestingObjectNode.size(); i ++) { 
      System.out.println(interestingObjectNode.get(i).path("word").asText()); 
     } 

cevap

7

Belki de bu blog girişi yardımcı olabilir: Traversing JSON trees with Jackson?

Elinizde kesin hangi sorun emin değilim, ama dikkat edilmesi gereken bir şey JSON Diziler girişin dizinini DEĞİL adını geçirmeden varolmaktadırlar olmasıdır. Yani objectNode.get("key") kullanırsanız, bunun yerine arrayNode.get(0) kullanın. Veya, güvenli oynamak ve "eksik" girişlere izin vermek istiyorsanız, arrayNode.path(0)'u (ve JSON Nesneleri için ditto) kullanın.

Ayrıca JSON Ağaçları (JsonNode) ve POJO'lar arasında gidebileceğinizi de unutmayın; ObjectMapper, temsiller (convertValue(), readAsTree(), treeToValue(), valueToTree()) arasında dönüştürme için birçok yönteme sahiptir. Bu nedenle, bazı parçalar için veri bağlama, diğerleri için ağaç modeli kullanmak mümkündür; Bazen alt ağaçların POJO'lar olarak bağlanması, diğer zamanlarda sadece yüksek-seviyeli veri bağlama ve ağaç modelini kullanarak alt ağaçlara erişim. Bu, işleri yapmak için çok güçlü bir yoldur, ancak alışması biraz zaman alır.

Bu yardımcı olur umarız!

+0

Bir önceki yorumumu sildim - En sonunda orada buldum, bu soruyu herkesin bulması durumunda bir miktar kod koydum. – umbraphile

+0

Güvenli? Bu jackson kullanımında "Güvenli" ile ne demek istiyorsun? @StaxMan – gumuruh

+0

Eğer 'get' kullanırsanız ve eşleşen bir düğüm yoksa, null değerini döndürür ve kontrol edilmesi gerekir. Ancak 'yol' ile, sanal bir "kayıp düğüm" döndürülür, bu nedenle boş çeklere gerek yoktur. – StaxMan

0

Bazı özellikleri olmayan bir POJO oluşturursanız, Google'ın GSON'unda, ilgili JSON yoksayılır. Yalnızca eşleşen isimlere sahip mülkleri doldurur. kelimeleri almak için tüm döngüler yazılmasını önlemek için lambdaj kullanmak sonra

Query{ 
Pages{ 
Word[] Links; 
} 
} 

Word{ 
String word; 
String code; 
} 

ve: Neden böyle bir sınıf oluşturmak değil?

o çekici bir görünüm here değildir ve depolama için kendi biçimi olarak JSON kullanmak belgenin

sürü vb MongoDB ve RavenDB gibi orada veritabanları JSONPath

deneyin. Karmaşık JSON sorguları onlara yerleşik, kullandıkları aynı kütüphaneleri kullanın.

+1

Neden olumsuz oy veriyorsunuz? Kod ise - çeşitli POJO sınıflarının bileşimini açıklayan sahte bir koddur. – Zasz

+0

Orijinal soru, POJO tanımlarının kullanılmasının istenmediğini, bu yüzden sadece yaklaşımını değil, veri bağlamayı dikkate almayı öneren ifadeleri geliştirdiğini gösterdi?(jackson vs gson kullanarak ditto) – StaxMan