2017-03-03 85 views
3

我想解析具有無效結構的json,它具有使用Jackson庫的重複鍵。如果一個json有重複的鍵,我想將它們解壓爲Collection解析包含重複鍵的json

的我試圖解析什麼(我試圖解析實際的JSON來自 Wireshark JSON出口)

例子:

{ 
    "a": "a", 
    "a": { 
     "b": { 

     }, 
     "b": true 
    } 
} 

但是,由於該JSON有重複鍵,只有最後一個值會被保留:

JsonNode tree = new ObjectMapper().readTree(json); 
System.out.println(tree); // {"a":{"b":true}} 

我也試過Guava模塊具有Multimap支持,但如預期的嵌套JSON對象這是行不通的。

利用番石榴模塊json的例子,我以前所示:

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new GuavaModule()); 
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); 

Multimap read = mapper.readValue(json, Multimap.class); 
System.out.println(read); // {a=[a, {b=true}]} 

我應該如何解決使用Jackson庫這個問題?有沒有其他的庫可以支持java的這種json結構的解析?

+1

有效的JSON的

net.sf.json.JSONObject: {"a":["a",{"b":[{},true]}]} com.fasterxml.jackson.databind.JsonNode{"a":["a",{"b":[{},true]}]} 

Maven的依賴沒有重複鍵,所以解析庫不應該工作的方式,你'請求 –

+0

SyntaxError:第3行重複鍵'a' –

回答

3

如果您可以靈活使用json庫,則可以使用net.sf.json.JSONObject

該庫將通過將重複值存儲到數組中來保留重複值。如果多個相同的鍵可用,它將創建一個鍵將所有的值作爲Array。

而且編碼部分只是一行。一旦你使用net.sf.json.JSONObject解析了json,那麼你可以將它提供給jackson庫。

JSONObject jsonObject = JSONObject.fromObject("{ \"a\": \"a\", \"a\": { \"b\": {},\"b\": true}}"); 

System.out.println("net.sf.json.JSONObject: " + jsonObject); 

JsonNode jsonNode = new ObjectMapper().readTree(jsonObject.toString()); 

System.out.println("com.fasterxml.jackson.databind.JsonNode" + jsonNode); 

輸出:net.sf.json

<dependency> 
    <groupId>net.sf.json-lib</groupId> 
    <artifactId>json-lib</artifactId> 
    <version>2.4</version> 
    <classifier>jdk15</classifier> 
</dependency> 
+0

有沒有一種方法,我們可以刪除重複項,並保持它作爲一個單一的對象,而不是一個陣列 –

+0

@AtulSoman不可能只要你使用重複密鑰。 –

2

您可以使用「jackson」庫以流式方式通過令牌讀取json消息令牌,然後它不會吃任何形式的消息。

+0

我相信t帽子也是唯一可行的方法。有一些信息可以開始在這個答案:http://stackoverflow.com/a/25426227/13075 – Henrik