解析包含重复键的json

我正在尝试使用Jackson库解析具有重复键的无效结构的json。 如果json有重复键,我想将它们作为Collection提取。

我正在尝试解析的示例(我正在尝试解析的实际json来自Wireshark json export):

 { "a": "a", "a": { "b": { }, "b": true } } 

但是,由于此json具有重复键,因此仅保留最后一个值:

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

我也尝试过具有Multimap支持的Guava模块,但它不能像嵌套的json对象那样工作。

我之前展示的json使用Guava模块的示例:

 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结构?

如果您对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.JSONObject: {"a":["a",{"b":[{},true]}]} com.fasterxml.jackson.databind.JsonNode{"a":["a",{"b":[{},true]}]} 

net.sf.json Maven依赖

  net.sf.json-lib json-lib 2.4 jdk15  

您可以使用“jackson”库以流方式通过令牌读取json消息令牌,然后它不会从消息中获取任何内容。