【发布时间】:2017-07-23 05:22:00
【问题描述】:
我正在尝试使用 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}}
我也尝试过支持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 没有重复的键,因此解析库不应该按照您的要求工作
-
SyntaxError: Duplicate key 'a' on line 3
-
重复键是有效的 json。 tools.ietf.org/html/rfc7159 "对象中的名称应该是唯一的",不需要是唯一的。
-
@OneCricketeer 我不知道。 ECMA-404(从 json.org 链接)说:“JSON 语法对用作名称的字符串没有任何限制,不要求名称字符串是唯一的,并且对名称/值的顺序没有任何意义对。这些都是可能由 JSON 处理器或在定义 JSON 用于数据交换的特定用途的规范中定义的语义考虑因素。”