2016-07-27 38 views
0

我有這樣一個模式(簡體):爪哇 - 傑克遜的Json封裝遍歷樹

{ 
    "range": { 
    "offset": 0, 
    "limit": 1, 
    "total": 2 
    }, 
    "items": [ 
    { 
     "id": 11, 
     "name": "foo", 
     "children": [ 
     { 
      "id": 112, 
      "name": "bar", 
      "children": [ 
      { 
       "id": 113, 
       "name": "foobar", 
       "type": "file" 
      } 
      ], 
      "type": "folder" 
     }, 
     { 
      "id": 212, 
      "name": "foofoo", 
      "type": "file" 
     } 
     ], 
     "type": "room" 
    }, 
    { 
     "id": 21, 
     "name": "barbar", 
     "type": "room" 
    } 
    ] 
} 

我僅需要讀取特定值就像從第一室(項目)「ID」。爲此,我需要遍歷每個級別上的所有項目(n個項目爲root,n個項目爲n個子項)與類型文件夾或文件。

現在我有這樣的代碼:

POJO

public static class Item { 
    public int id; 
} 

傑克遜樹迭代

ObjectMapper mapper = new ObjectMapper(); 
com.fasterxml.jackson.databind.JsonNode root = mapper.readTree(JSON); 
root = root.get("items").get(0); 
TypeReference<List<Item>> typeRef = new TypeReference<List<Item>>(){}; 
List<Item> list = mapper.readValue(root.traverse(), typeRef); 
for (Item f : list) { 
    System.out.println(f.id); 
} 

我怎樣才能讓所有的孩子都的ID與特定類型的所有項目? 如何在不定義整個模式的情況下避免「無法識別的字段」異常?

非常感謝您的幫助!

回答

0

使用readTree(...)方法來解析JSON,而無需定義整個模式並找到名爲「id」的節點。

然後,您可以使用findValues(「id」)來獲取值列表。

+0

謝謝您的回答。我已經使用readTree(更新的問題),但我需要更多的處理邏輯爲找到的項目。因此,我需要列出所有「文件」和「文件夾」項目。 – metamagicson

+0

根JsonNode上的findValues(「file」)和findValues(「folder」)會給你。因爲這個原因,它返回一個JsonNodes列表。 – Gandalf

1

嘗試使用java8功能它有很多工作要做,它在較小的線路,

ObjectMapper mapper = new ObjectMapper(); 
Pass your json value 
Map obj = mapper.readValue(s, Map.class); 

List<Object> items= (List<Object>) obj.get("items"); 
Object[] Ids= items 
.stream() 
.filter(items-> ((Map)items).get("type").equals("room")) 
.toArray()