2017-05-05 19 views
1

我使用Jackson將JSON反序列化爲不可變的自定義Java對象。這裏是類:使Jackson在反序列化過程中無法將double轉換爲int

final class DataPoint { 
    private final int count; 
    private final int median; 

    @JsonCreator 
    DataPoint(
     @JsonProperty("count") int count, 
     @JsonProperty("median") int median) { 
    if (count <= 0) { 
     throw new IllegalArgumentException("..."); 
    } 
    this.count = count; 
    this.median = median; 
    } 

    // getters... 
} 

這裏是我反序列化JSON:

{ 
    "count": 1, 
    "median": 2 
} 

它工作正常。現在,我打破了JSON,即帶有小數代替整數median

{ 
    "count": 1, 
    "median": 0.1 
} 

現在,我得到count == 1median == 0。相反,我希望傑克遜失敗,因爲JSON屬性median的數據類型和正式的median參數類型(int)是不同的,並且轉換實際上會丟失數據。

這裏是反序列化代碼:

String json = "..."; // the second JSON 
ObjectMapper mapper = new ObjectMapper() 
    .enable(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES) 
    .enable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES) 
    .enable(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE); 
DataPoint data = mapper.readValue(json, DataPoint.class); 

夥計們,我可以讓傑克遜desierializing十進制整數時失敗?

非常感謝您,夥計們!

回答

1

有爲此目的的選項ACCEPT_FLOAT_AS_INT。例如。 :

ObjectMapper mapper = new ObjectMapper(); 
mapper.disable(DeserializationFeature.ACCEPT_FLOAT_AS_INT); 

併爲"0.1"您將獲得:螺紋

異常 「主」 com.fasterxml.jackson.databind.JsonMappingException:不能強迫一個 浮點值(「0.1 ')轉換爲Integer;使 DeserializationFeature.ACCEPT_FLOAT_AS_INT允許

你可以看到相關的文檔here

注意,這是可用的,因爲傑克遜2.6

+0

非常感謝!它工作正常。只是一個littile可惜的是'2.0'不能轉換爲'2'這個功能。無論如何,它比我以前做得更好。謝謝,老兄! – danissimo

1

您可以定義JSON模式爲您的JSON文件並運行deserialisation到之前的驗證Java對象。

如果將median屬性定義爲integer類型,則浮點數將被拒絕。

該方法還可以解決允許代表integersfloat numbers也被接受的問題,例如2.0。該模式需要定義median屬性如下:

{ 
    ... 
    "median": { "type": "number", "multipleOf": 1.0 } 
} 
+0

非常感謝,RZet! Manos建議的方法定義JSON模式要容易得多。另外,JSON模式並不能解決成功將'2.0'(十進制)轉換爲'2'(整數)轉換的問題。無論如何,thanx很多,夥計。我會記住它。 – danissimo

+1

@danissimo希望我的更新後的文章可以讓你用一塊石頭就能殺死兩隻鳥; – RZet

+0

哇!我必須嘗試一下。看起來不錯。謝謝! – danissimo

相關問題