我看到傑克遜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. 傑克遜JSON處理的鍵名= OGNL名
- 3. 傑克遜fasterxml具有相同名稱的多個元素
- 4. 停止傑克遜從變化的名稱變量名稱
- 5. 傑克遜XML序列化XMLElementRef名稱
- 6. 傑克遜 - 無屬性名稱
- 7. 傑克遜解析命名對象爲同一類
- 8. 傑克遜未命名的字段我多麼希望
- 9. 傑克遜處理剩餘字段
- 10. 傑克遜Java來JSON對象映射器修改字段的名稱
- 11. 使用傑克遜解析和未命名的數組
- 12. 傑克遜反序列化具有多個名稱的枚舉
- 13. 在JSON解析無名映射使用傑克遜
- 14. 同名字段GSON解析
- 15. 傑克遜寫字段名的嵌套樹
- 16. 了Java傑克遜解串器同時處理布爾和同一領域
- 17. 的Json /傑克遜命名約定
- 18. 傑克遜的Json accesing JsonNode屬性名
- 19. 解析處理OpenXML具有相同名稱的多個元素
- 20. 解析JSON與傑克遜
- 21. 解析JSON與傑克遜
- 22. 傑克遜用java解析
- 23. JSON解析與傑克遜
- 24. Android JSON解析(傑克遜)
- 25. 傑克遜系列化怎麼不顯示類和字段名
- 26. 爲傑克遜指定字段命名策略
- 27. 處理傑克遜例外
- 28. 傑克遜錯誤處理
- 29. 傑克遜複雜名單序列化
- 30. Android傑克遜JSON解析器空值
如果我想讓反序列化器在發現重複屬性時發出錯誤,該怎麼辦? – 2rs2ts 2015-01-23 19:07:00
@ 2rs2ts - 拋出重複錯誤的錯誤是解串器的默認行爲。如果這就是你想要發生的事情,那麼你不需要這個答案中的解決方案。 – Perception 2015-01-29 15:51:33
謝謝。我對我的JSON在我的代碼中經歷了哪種反序列化器感到困惑,所以我猜我認爲這不是默認行爲是錯誤的:)但無論如何,這很好。 – 2rs2ts 2015-01-29 19:21:54