2016-10-17 29 views
3

我想爲需要JSON輸入的前端庫創建一個java SDK。實質上,該SDK將某些類型的對象轉換爲JSON,然後由該前端庫使用。使用傑克遜反序列化時丟失的字段(多態)

我使用傑克遜的多態序列化/反序列化使用其註釋系統。

我有一個基類A和2個子類B和C擴展A.類A有一個類型字段,使用它我決定使用哪個類(B或C)。語法看起來是這樣的:

@JsonTypeInfo({ 
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.EXISTING_PROPERTY, 
    property= "type" 
}) 
@JsonSubTypes({ 
    @JsonSubTypes.Type(value = B.class, name = "b"), 
    @JsonSubTypes.Type(value = C.class, name = "c") 
}) 
public class A { 
    private String type; 

    public void setType(String type){ 
    this.type = type; 
    } 

    public String getType(){ 
    return this.type; 
    } 
} 

public class B extends A { 

} 

public class C extends A { 

} 

所以現在,當我使用傑克遜的ObjectMapperreadValue功能和閱讀字符串化JSON,並轉換爲A類,我得到基於無論是A類或B類的正確實例關於類型變量的值。 然而,這裏是實際的問題,當我嘗試使用功能getType我總是在這些對象獲得null。我不知道爲什麼傑克遜沒有在對象上設置這些值。

String json = "{ type: 'b' }"; // example input json 

ObjectMapper om = new ObjectMapper(); 
A a = om.readValue(json, A.class); 
// a is actually an instance of class B 

a.getType()// this is null 

回答

2

您需要添加到@JsonTypeInfo參數visible = true避免反序列化時卸下的類型。

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.EXISTING_PROPERTY, 
    property= "type", 
    visible = true 
) 

公共抽象布爾可見()默認假

屬性定義是否類型標識符值將作爲串並轉換器(真)JSON流的一部分來傳遞,或處理和由TypeDeserializer除去 (假)。屬性對 序列化沒有影響。默認值爲false,這意味着Jackson處理 並從JSON內容中移除類型標識符,JSONDeserializer傳遞給 。

+0

謝謝,工作!不知道我在文檔中錯過了它。 – Rajan