jackson 解析包含重复键的JSON

9jyewag0  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(109)

我正在尝试使用Jackson库解析具有重复键的无效结构的json。如果json有重复键,我想将它们提取为Collection
我试图解析的示例(我试图解析的实际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对象上。
使用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结构?

ufj5ltwl

ufj5ltwl1#

如果你是灵活的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依赖

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

rqdpfwrv

rqdpfwrv2#

在Jackson库中,你可以以流的方式逐个令牌地读取JSON消息,这样它就不会从消息中吃掉任何东西。

相关问题