2013-12-14 94 views
14

傑克遜JSON反序列化過程中缺少的屬性在這個例子中忽略的Java

Class Person{ 
    String name; 
    int age; 
} 

如果JSON對象具有丟失屬性「年齡」,

{ 
    name : John 
} 

Person person = objectMapper.readValue(jsonFileReader, Person.class); 

它拋出一個JsonMappingException說,它不能反序列化。在反序列化過程中是否有註釋忽略缺少的字段?

感謝

+0

請發佈完整的堆棧跟蹤。 –

回答

23

我想你想要的是

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) 
public class Person { 
    ... 
} 

這就是傑克遜1.x的方式。我認爲在2.x中有一個新的方法。類似於

@JsonInclude(Include.NON_NULL) 
public class Person { 
    ... 
} 

這些將告訴傑克遜只序列化非空的值,並且在反序列化缺少的值時不要抱怨。我認爲它會將其設置爲Java默認值。

2
+1

該文檔已移至http://fasterxml.github.io/jackson-annotations/javadoc/2.0.2/com/fasterxml/jackson/annotation/JsonIgnore.html –

+0

時間和版本的不可避免的進展使@ MagnusReftel的鏈接壞了(因爲他們似乎沒有保留舊版本的javadoc)。更新後的鏈接是https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonIgnore.html –

+0

「@ JsonIgnore」指示傑克遜完全排除財產在序列化和反序列化? – Yoshiya

35

@JsonIgnoreProperties(ignoreUnknown = true)在類級別工作對我來說

+0

這是工作,但在更高的水平。請注意,因爲它會阻止系統在json參數「不匹配」的情況下觸發異常。 – Tobliug

7

基於註解的方法是忽視,但如果需要更好的方法。反序列化的手工方式:

ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
Person  person = mapper.readValue(jsonFileReader, Person.class); 
+0

你介意解釋基於_why_註解的方法比「手動方式」更好嗎? – jayeffkay

+1

@jayeffkay總的來說,只關注Pojo而不是反序列化邏輯是首選方法。您可以將其視爲像手動創建JDBC連接vs ORM實體。但是如果你想要一個自定義解決方案手動方式是受歡迎的。 –