我看到傑克遜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