有一個抽象類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
難道這是問題嗎? http://stackoverflow.com/a/14228184/4793951 – Zircon
@Zircon正如代碼片段所述,我只指定了「JsonTypeInfo.Id.NAME」。另外,「JsonTypeInfo」僅在基類中設置,而不在子類中設置。 –