2012-01-17 20 views
3

我有一些bean,並且他們在JSon中明確地模擬了核心數據類型。然而,有時Jsons即時閱讀有額外的數據。Jackson:避免由於未建模字段造成的異常

有沒有一種方法在jackson中註釋/定義一個Bean,以便它爲某些字段(例如我所知的字段)使用顯式字段名稱,同時將額外的字段填充到map/list中?

回答

10

是有,假設你確實要保留所有的額外/無法識別的參數,然後做這樣的事情:

public class MyBean { 
    private String field1; 
    private String field2; 
    private Integer field3; 
    private Map <String, Object> unknownParameters ; 

    public MyBean() { 
     super(); 
     unknownParameters = new HashMap<String, Object>(16); 
    } 

    // Getters & Setters here 

    // Handle unknown deserialization parameters 
    @JsonAnySetter 
    protected void handleUnknown(String key, Object value) { 
     unknownParameters.put(key, value); 
    } 
} 

要配置的參數全局處理,你可以選擇定義的DeserializationProblemHandler實現並用ObjectMapper配置全局註冊它。

DeserializationProblemHandler handler = new MyDeserializationProblemHandler(); 
ObjectMapper.getDeserializationConfig().addHandler(handler); 

如果你發現你真的不關心的未知參數,那麼你可以簡單地將其關閉。以@JsonIgnoreProperties(ignoreUnknown = true)爲基礎,或通過配置ObjectMapper在全局基礎上:

objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false) 
+0

謝謝 - 如果參數不是關鍵值parirs?也就是說,如果輸入是一個列表呢?我可以使用Object []作爲@JsonAnySetter方法的輸入參數嗎? – jayunit100 2012-01-17 09:31:04

+0

任何nn-primitive都可以​​存儲爲鍵值對中的值。唯一需要注意的是,您必須知道在稍後從您的地圖中檢索時鍵的類型。 – Perception 2012-01-17 12:08:44

+0

這是超級酷。 – rfinz 2014-01-23 17:41:42