2016-09-19 49 views
0

有一個抽象類Product和另一個類SomeProduct,它擴展了Product通過傑克遜的反序列化失敗,父類/子類失敗

Product

@JsonTypeInfo 
(
use = JsonTypeInfo.Id.NAME, 
include = JsonTypeInfo.As.PROPERTY, 
property = "type" 
) 
@JsonSubTypes 
({ 
    @JsonSubTypes.Type(value = SomeProduct.class, name = Product.PRODUCT_TYPE_SOME) 
}) 
public abstract class Product 
{ 
    static final String PRODUCT_TYPE_SOME = "some_product"; 
} 

SomeProduct

public class SomeProduct extends Product 
{ 
    @JsonProperty("status") 
    @JsonSerialize(include = JsonSerialize.Inclusion.NON_DEFAULT) 
    private int status; 

    public int getStatus() 
    { 
     return status; 
    } 

    public void setStatus(int status) 
    { 
     this.status = status; 
    } 
} 

將會有更多的類(不同的產品),這將延伸Product

當我序列化使用ObjectMapper

ObjectMapper mapper = new ObjectMapper(); 

Product p = new SomeProduct(); 
String json = mapper.writeValueAsString(p); 

這是輸出:

{ 「類型」: 「some_product」}

現在,當我嘗試反序列化它,

Product x = mapper.convertValue(json, Product.class); 

這個異常被拋出:

java.lang.IllegalArgumentException異常:意外的令牌(VALUE_STRING),預計FIELD_NAME:缺少屬性 '類型' 是包含類型ID(類com.shubham.model.Product) at [Source:N/A; line:-1,column:-1]

我在做什麼錯在這裏?我看了所以發現一個問題,defaultImpl被用在JsonTypeInfo。但是我無法將json反序列化爲「Default Impl」,因爲JSON對於特定實現總是有效的。

使用傑克遜2.4.3

+2

難道這是問題嗎? http://stackoverflow.com/a/14228184/4793951 – Zircon

+0

@Zircon正如代碼片段所述,我只指定了「JsonTypeInfo.Id.NAME」。另外,「JsonTypeInfo」僅在基類中設置,而不在子類中設置。 –

回答

3

您錯誤地使用mapper.convertValue(json, Product.class);。您應該使用: mapper.readValue(json, Product.class);

convertValue使用:

從給定值做兩步轉換的便捷方法,爲給定的值類型的 情況下,需要如(但只有當!)轉換。 如果給定值已經是請求類型,則按原樣返回值。

+0

謝謝,這正是問題所在。 –