2011-11-20 56 views
9

我發現了幾個與我正在嘗試做的事情接近的答案,但還沒有足夠讓我能夠實現它。我有一堆看起來像這個例子的JSON(實際上只有幾個級別更深,並且有數百個物品在我想訪問的級別):{"query":{"pages":{"links":[{"word":"bobsyeruncle","code":4},{"word":"easyaspie","code":3}]}}}。我無法改變格式;它是別人的API。我不需要很多這樣的東西;實際上我只想要一些像[「bobsyeruncle」,「easyaspie」]的數組。 (或一個列表或任何)使用Jackson從JSON數組中檢索字符串

我試驗了一個簡單版本的JSON,沒有數組,並且能夠使用rootNode.get(「query」)輕鬆訪問單個字符串。 (「頁面」)...在https://stackoverflow.com/questions/338586/a-better-java-json-library/338608#338608中描述的方式。但是我一直無法以這種方式獲得陣列。我在這裏找到的大多數答案都假設我想創建一個像「鏈接」這樣的POJO,其中包含「單詞」和「代碼」,但我不這樣做。爲了訪問我想要的字符串,是否有必要創建一個類似「鏈接」的列表,其中包含「單詞」和「代碼」,然後忽略「代碼」?這看起來不正確。

(此外,如果任何人都可以指向我的文檔/教程在JacksonInFiveMinutes教程和整個的javadoc之間的某處,我敢肯定,這將有助於太。)

ETA這個工作,我覺得!:

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

回答

7

也許這個博客條目可能有所幫助:Traversing JSON trees with Jackson

我不確定你有什麼確切的問題,但有一點需要注意的是JSON數組是通過傳入索引的條目而不是名稱來遍歷的。因此,如果您使用objectNode.get("key"),則可以使用arrayNode.get(0)代替。 或者,如果您想安全播放並允許「丟失」條目,請使用arrayNode.path(0)(以及JSON對象的同上)。

另外請記住,你可以返回JSON樹(JsonNode)和POJO; ObjectMapper有多種方法用於在表示之間進行轉換(convertValue(),readAsTree(),treeToValue(),valueToTree())。所以有可能對某些部分使用數據綁定,對其他部分使用樹模型;有時將子樹綁定爲POJO,其他時候只是數據綁定高級別,並使用樹模型訪問子樹。這是一種非常強大的做事方式,但需要一段時間才能適應。

希望這會有所幫助!

+0

刪除我以前的評論 - 我最終到達那裏,把上面的一些代碼,以防萬一誰發現這個問題。 – umbraphile

+0

安全嗎?傑克遜用法中的「安全」是什麼意思? @StaxMan – gumuruh

+0

安全的意思是,如果你使用'get',並且沒有匹配的節點,它將返回null,並且必須被檢查。但是'路徑'會返回虛擬的「缺失節點」,因此不需要進行空值檢查。 – StaxMan

0

在Google的GSON中,如果您創建缺少某些屬性的POJO,則會忽略相應的JSON。它僅填充具有匹配名稱的那些屬性。爲什麼不創建這樣的類:

Query{ 
Pages{ 
Word[] Links; 
} 
} 

Word{ 
String word; 
String code; 
} 

然後使用LambdaJ避免編寫所有的循環來獲取單詞?

如果不是有吸引力的外觀here並嘗試JSONPath

大量的文檔數據庫有像的MongoDB和RavenDB等使用JSON作爲其存儲格式。查詢複雜的JSON是內置的,使用他們正在使用的相同的庫。

+1

留下你爲什麼給予反對票的評論?如果是代碼 - 它顯然是一個僞代碼,它解釋了各種POJO類的組成。 – Zasz

+0

原始問題表明不希望使用POJO定義,所以也許只是改進措辭來表明不是他的方法,而是考慮數據綁定?(同上使用傑克遜vs gson) – StaxMan