有一个抽象类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) 在[资料来源:N / A; line:-1,column:-1]
我在这里做错了什么?我已经查看了SO,并在defaultImpl
中找到了JsonTypeInfo
使用{{1}}的问题。但我无法将json反序列化为" Default Impl"因为JSON将始终对特定实现有效。
使用Jackson 2.4.3
答案 0 :(得分:3)
你错误地使用mapper.convertValue(json, Product.class);
。你应该使用:
mapper.readValue(json, Product.class);
convertValue使用:
从给定值进行两步转换的便捷方法 给定值类型的实例,if(但仅限于!)转换是必需的。 如果给定值已经是请求的类型,则按原样返回值。