解析包含重复键的json

时间:2017-03-03 07:32:01

标签: java json jackson

我正在尝试使用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}}

我还尝试了Guava支持Multimap的模块,但它对嵌套的json对象没有预期效果。

使用Guava模块为我之前展示过的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结构?

2 个答案:

答案 0 :(得分:5)

如果您对json库很灵活,可以使用net.sf.json.JSONObject

此库将通过将它们存储到数组中来保留重复的值。如果有多个相同的键可用,它将创建一个键,将所有值作为数组。

编码部分也只是一行。一旦使用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依赖关系
<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

答案 1 :(得分:2)

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