我正在尝试使用无效结构解析json,该结构具有使用Jackson
库的重复键.如果json有重复键,我想将它们作为一个提取Collection
.
我正在尝试解析的示例(我正在尝试解析的实际json来自Wireshark
json export):
{
"a": "a",
"a": {
"b": {
},
"b": true
}
}
Run Code Online (Sandbox Code Playgroud)
但是,由于此json具有重复键,因此仅保留最后一个值:
JsonNode tree = new ObjectMapper().readTree(json);
System.out.println(tree); // {"a":{"b":true}}
Run Code Online (Sandbox Code Playgroud)
我也尝试过Guava
有Multimap
支持的模块,但它不能像嵌套的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}]}
Run Code Online (Sandbox Code Playgroud)
我应该如何使用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 );
Run Code Online (Sandbox Code Playgroud)
输出:
net.sf.json.JSONObject: {"a":["a",{"b":[{},true]}]}
com.fasterxml.jackson.databind.JsonNode{"a":["a",{"b":[{},true]}]}
Run Code Online (Sandbox Code Playgroud)
Maven依赖 net.sf.json
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5111 次 |
最近记录: |