通过jackson进行反序列化会导致父/子类失败

时间:2016-09-19 13:40:34

标签: java json jackson

有一个抽象类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

1 个答案:

答案 0 :(得分:3)

你错误地使用mapper.convertValue(json, Product.class);。你应该使用: mapper.readValue(json, Product.class);

convertValue使用:

  

从给定值进行两步转换的便捷方法         给定值类型的实例,if(但仅限于!)转换是必需的。         如果给定值已经是请求的类型,则按原样返回值。