2017-03-03 79 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