2013-05-15 50 views
32

說我有下面的類:@JsonUnwrapped的傑克遜反序列化等價物是什麼?

public class Parent { 
    public int age; 
    @JsonUnwrapped 
    public Name name; 
} 

生產JSON:

{ 
    "age" : 18, 
    "first" : "Joey", 
    "last" : "Sixpack" 
} 

如何反序列化這回父類?我可以用@JsonCreator

@JsonCreator 
public Parent(Map<String,String> jsonMap) { 
    age = jsonMap.get("age"); 
    name = new Name(jsonMap.get("first"), jsonMap.get("last")); 
} 

但是,這也有效地增加了@JsonIgnoreProperties(ignoreUnknown=true)父類,所有屬性映射到這裏。所以如果你想讓未知的JSON字段拋出異常,你必須自己去做。另外,如果地圖值可能不是字符串,你必須做一些手動類型檢查和轉換。傑克遜有辦法自動處理這種情況嗎?

編輯: 我可能是瘋了,但其實這顯示,儘管從來沒有在文件中被明確提及的工作:http://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonUnwrapped.html
我敢肯定它沒有爲我工作之前。不過,當需要定製邏輯來反序列化未包裝的多態類型時,建議的@JsonCreator方法可能更受歡迎。

+2

你確定'@ JsonUnwrapped'正在爲反序列化工作嗎?我試過了,當我嘗試反序列化扁平化的JSON時,出現'Could not read JSON:Unrecognized field ...'錯誤。 –

回答

26

您可以使用@JsonCreator@JsonProperty每個字段:

@JsonCreator 
public Parent(@JsonProperty("age") Integer age, @JsonProperty("firstName") String firstName, 
     @JsonProperty("lastName") String lastName) { 
    this.age = age; 
    this.name = new Name(firstName, lastName); 
} 

傑克遜沒有類型檢查和你在這種情況下,未知領域的檢查。

+1

好點。這確實回答瞭如何在JsonCreators中保留傑克遜類型/字段檢查的問題,這可能是唯一有用的問題。 =) – Shaun