2011-11-20 15 views
9

Znalazłem kilka odpowiedzi, które są bliskie temu, co próbuję zrobić, ale nie na tyle, że udało mi się je uruchomić. Mam pakiet JSON, który wygląda jak ten przykład (tylko kilka poziomów głębiej i setki elementów na poziomie, do którego chcę uzyskać dostęp): {"query":{"pages":{"links":[{"word":"bobsyeruncle","code":4},{"word":"easyaspie","code":3}]}}}. Nie mogę zmienić formatu; to API kogoś innego. Jest bardzo dużo tego, czego nie potrzebuję; w rzeczywistości chcę tylko czegoś takiego jak tablica ["bobsyeruncle", "easyaspie"]. (Lub listę lub cokolwiek innego).Pobierz ciągi z tablicy JSON przy użyciu Jackson

Eksperymentowałem z prostszą wersją JSON, która nie miała tablicy, i był w stanie uzyskać dostęp do pojedynczego ciągu z łatwością za pomocą rootNode.get ("zapytanie"). ("strony") ... sposób opisany w https://stackoverflow.com/questions/338586/a-better-java-json-library/338608#338608. Ale nie udało mi się dotrzeć do tablicy w ten sposób. Większość odpowiedzi, które tutaj znalazłem, zakłada, że ​​chcę utworzyć POJO, takie jak "Linki", które zawierają zarówno "słowo", jak i "kod", czego ja nie rozumiem. Aby uzyskać dostęp do żądanych ciągów, należy utworzyć coś w rodzaju listy "Łącza", która zawiera zarówno "słowo" i "kod", a następnie zignorować "kod"? To nie wydaje się właściwe.

(Także, jeśli ktoś może wskazać mi dokumentacji/samouczki gdzieś pomiędzy samouczka JacksonInFiveMinutes i całego javadoc, jestem pewien, że pomogłoby zbyt.)

ETA to działało, myślę !:

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

Odpowiedz

7

Być może ten wpis na blogu może pomóc: Traversing JSON trees with Jackson?

Nie jestem pewien, jaki masz dokładny problem, ale należy zauważyć, że tablice JSON są przemierzane przez przekazujący indeks wpisu, a NIE nazwę. Więc podczas gdy używasz objectNode.get("key"), zamiast tego używasz arrayNode.get(0). Lub, jeśli chcesz grać bezpiecznie i pozwolić na "brakujące" wpisy, użyj arrayNode.path(0) (i tak samo dla obiektów JSON).

Pamiętaj również, że możesz wrócić między drzewami JSON (JsonNode) i POJO; ObjectMapper ma wiele metod konwersji reprezentacji (convertValue(), readAsTree(), treeToValue(), valueToTree()). Tak więc możliwe jest użycie powiązania danych dla niektórych części, modelu drzewa dla innych; czasami wiążące pod-drzewa jako POJO, innym razem po prostu wiążące dane na wysokim poziomie i uzyskujące dostęp do pod-drzew przy użyciu modelu drzewa. Jest to bardzo skuteczny sposób robienia rzeczy, ale trochę się przyzwyczaja.

Mam nadzieję, że to pomoże!

+0

Usunięto mój poprzedni komentarz - W końcu tam dotarłem, umieść kod powyżej, na wypadek gdyby ktoś znalazł to pytanie. – umbraphile

+0

Bezpieczny? co masz na myśli przez "Safe" w tym użyciu jackson? @StaxMan – gumuruh

+0

Bezpieczne znaczenie, że jeśli użyjesz 'get', a nie ma węzła dopasowującego, zwróci on null i musi być zaznaczone. Ale z "path" zwracany jest wirtualny "brakujący węzeł", więc nie są potrzebne żadne kontrole zerowe. – StaxMan

0

W Google GSON, jeśli utworzysz POJO, które nie ma niektórych właściwości, wówczas odpowiedni JSON jest ignorowany. Wypełnia tylko te właściwości, które mają pasujące nazwy. Dlaczego nie utworzyć klasy takiej jak ta:

Query{ 
Pages{ 
Word[] Links; 
} 
} 

Word{ 
String word; 
String code; 
} 

, a następnie użyć LambdaJ, aby uniknąć pisania wszystkich pętli, aby uzyskać słowa?

Jeśli nie jest to atrakcyjny wygląd here i spróbuj JSONPath

Dużo dokumentu baz tam jak MongoDB i RavenDB etc używać JSON jako format przechowywania. Zapytanie o złożony JSON jest wbudowane w nie, użyj tych samych bibliotek, których używają.

+1

Zostaw komentarz z tym, dlaczego dajesz negatywny głos? Jeśli jest to kod - jest to oczywiście pseudo-kod, który wyjaśnia skład różnych klas POJO. – Zasz

+0

Oryginalne pytanie wskazało, że używanie definicji POJO nie było pożądane, więc może po prostu poprawisz sformułowanie sugerujące, że zamiast swojego podejścia, nadal rozważasz powiązanie danych?(ditto for using jackson vs gson) – StaxMan

Powiązane problemy