解析包含重复键的json

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

我要解析的示例(我要解析的实际json来自Wiresharkjson导出):

{

"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结构解析的库?

回答:

如果您灵活使用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]}]}

<dependency>

<groupId>net.sf.json-lib</groupId>

<artifactId>json-lib</artifactId>

<version>2.4</version>

<classifier>jdk15</classifier>

</dependency>

以上是 解析包含重复键的json 的全部内容, 来源链接: utcz.com/qa/412648.html

回到顶部