2014-11-02 425 views
7

我目前在下列方式使用Java反序列化JSON與傑克遜掙扎:如何優雅地處理Jackson InvalidFormatException?

我想處理和反序列化JSON響應我從web服務背部和轉換的響應與傑克遜的幫助下的POJO。這在大多數情況下都能正常工作,只要我收到的響應包含正確格式的JSON屬性。

然而,由於web服務和交付的數據是超出我的控制,我不能依賴數據總是在正確的格式。

讓我給你舉個例子:

在我的POJO,有一個java.util.Date場,和JSON響應包含持有物業日期時間字符串。傑克遜將嘗試解析字符串並將其轉換爲Date。如果日期格式符合ObjectMapper's dateformat(ObjectMapper.setDateFormat(...)),則一切正常。如果格式不同,我會得到一個InvalidFormatException

現在的問題是,從服務發送的dateformat可能不同。我可以獲得格式化日期,如2014-11-02T00:00:00Z,但我也可以獲得日期格式,如2014-11(僅標識一個月而不是整個日期時間)。

我知道,我可以編寫一個自定義的反序列化器,它可以處理這個確切的情況,並正確處理具有不同日期格式的日期字符串。但是,因爲這隻能解決Dates的問題,但不能解決潛在的其他數據類型問題,所以我正在尋找更一般的方法。

我想什麼是有忽視其中InvalidFormatException發生的所有情況,並定義默認值(如null)的可能性(如果我期待有一個雙人牀和接收的字母數字字符串?發生什麼事如)各自的POJO領域。

那將是對我來說真正有價值的,如果任憑一個無效的日期格式返回或任何其他InvalidFormatException發生,其餘JSON仍然被反序列化到POJO。

這對Jackson來說有什麼可能嗎?

感謝您閱讀我的問題,直到最後,我會感謝任何指向正確方向的指針。

+0

我想知道的最佳實踐過。 – kai 2015-06-24 17:23:52

回答

0

不知道這是否是最佳做法,我對Jackson沒有什麼經驗。

您可以將DeserializationProblemHandler添加到ObjectMapper以指定反序列化器遇到奇怪的字符串或奇怪數字時發生的情況。

在你的情況,你可以設置處理,使得在遇到無法識別的格式時,而不是拋出一個InvalidFormatException,它只是返回null:

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.addHandler(new DeserializationProblemHandler() { 
    @Override 
    public Object handleWeirdStringValue(DeserializationContext ctxt, Class<?> targetType, String valueToConvert, String failureMsg) throws IOException { 
     return null; 
    } 

    @Override 
    public Object handleWeirdNumberValue(DeserializationContext ctxt, Class<?> targetType, Number valueToConvert, String failureMsg) throws IOException { 
     return null; 
    } 
});