2013-04-08 48 views
5

我看到傑克遜JSON解析器的一個功能,作爲我的案例的固有問題。 我要解析一個未知的文件,它可能不符合json格式,因此最終會有多個相同的鍵名。在這種情況下,如果我調用getFieldNames()之類的函數,它最終只會在這些多個相同的簡單元素中給出一個條目。 所以如果我對它做一個get(String),那麼我最終只會得到具有相同鍵值的Json節點中的一個,因爲我應該得到所有其他的節點 對此有何評論或解決方案?傑克遜解析器處理同名域名的多字段名稱

回答

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); 

或者,您可以創建一個自定義解串器,其收到的所有令牌(無論它們是否是重複的或沒有)。

+0

如果我想讓反序列化器在發現重複屬性時發出錯誤,該怎麼辦? – 2rs2ts 2015-01-23 19:07:00

+0

@ 2rs2ts - 拋出重複錯誤的錯誤是解串器的默認行爲。如果這就是你想要發生的事情,那麼你不需要這個答案中的解決方案。 – Perception 2015-01-29 15:51:33

+0

謝謝。我對我的JSON在我的代碼中經歷了哪種反序列化器感到困惑,所以我猜我認爲這不是默認行爲是錯誤的:)但無論如何,這很好。 – 2rs2ts 2015-01-29 19:21:54