我看到杰克逊JSON解析器的一个功能,作为我的案例的固有问题。 我要解析一个未知的文件,它可能不符合json格式,因此最终会有多个相同的键名。在这种情况下,如果我调用getFieldNames()之类的函数,它最终只会在这些多个相同的简单元素中给出一个条目。 所以如果我对它做一个get(String),那么我最终只会得到具有相同键值的Json节点中的一个,因为我应该得到所有其他的节点 对此有何评论或解决方案?杰克逊解析器处理同名域名的多字段名称
5
A
回答
4
大多数JSON解析器会拒绝您的输入文件,因为不允许在同一嵌套层次上使用重复键(这是事实上的标准)。但是,某些解析器将允许您以各种方式处理重复。
在杰克逊处理此问题的一种方法是将常规属性映射到实体类中,然后通过@JsonAnySetter
处理潜在的重复项。
public class Bag {
final transient Multimap<String, Object> multimap = LinkedListMultimap
.create();
// regular properties, constructors etc
@JsonAnySetter
public void add(final String key, final String value) {
multimap.put(key, value);
}
}
注意使用多重映射:普通的哈希映射不能包含重复键,所以多重映射是一个可行的解决方案的要求。反序列化输入文件后,所有'常规'JSON属性将映射到其相应的实体属性,而所有重复项将存储在映射中,并可用于手动处理。
final List<Object> duplicatedValues = multimap.get(someKey);
或者,您可以创建一个自定义解串器,其将收到的所有令牌(无论它们是否是重复的或没有)。
相关问题
- 1. 解析无名阵列与杰克逊
- 2. 杰克逊序列化领域,以不同的名称
- 3. 停止杰克逊从变化的名称变量名称
- 4. 杰克逊 - 无属性名称
- 5. 杰克逊未命名的字段我多么希望
- 6. 杰克逊处理剩余字段
- 7. 杰克逊Java来JSON对象映射器修改字段的名称
- 8. 同名字段GSON解析
- 9. 杰克逊写字段名的嵌套树
- 10. 了Java杰克逊解串器同时处理布尔和同一领域
- 11. 杰克逊的Json accesing JsonNode属性名
- 12. JSON解析与杰克逊
- 13. 解析JSON与杰克逊
- 14. 解析处理OpenXML具有相同名称的多个元素
- 15. 为杰克逊指定字段命名策略
- 16. 处理杰克逊例外
- 17. Android杰克逊JSON解析器空值
- 18. 杰克逊流解析器位置
- 19. 解析SQL中的名称字段
- 20. 杰克逊JSON处理器问题
- 21. 反序列化选择的属性名称只(杰克逊)
- 22. Spring Web MVC JSON - 杰克逊键/对象数组的名称(命名数组)
- 23. 解析域名
- 24. 配置泽西/杰克逊不使用@XmlElement字段注释JSON字段命名
- 25. HashMap中的杰克逊ObjectMapper解析返回所有字段= NULL
- 26. 来自多名域名服务器的DNS解析器结果
- 27. 杰克逊+泽西返回列表与根名称“列表”
- 28. 解析名称
- 29. 解析Scala的case类与杰克逊
- 30. 根据API版本指定不同的JSON属性名称与杰克逊
如果我想让反序列化器在发现重复属性时发出错误,该怎么办? – 2rs2ts 2015-01-23 19:07:00
@ 2rs2ts - 抛出重复错误的错误是解串器的默认行为。如果这就是你想要发生的事情,那么你不需要这个答案中的解决方案。 – Perception 2015-01-29 15:51:33
谢谢。我对我的JSON在我的代码中经历了哪种反序列化器感到困惑,所以我猜我认为这不是默认行为是错误的:)但无论如何,这很好。 – 2rs2ts 2015-01-29 19:21:54