杰克逊多态类型处理 - 属性丢弃

zih*_*oyu 7 java json jackson

我有这个JSON模型类,

public class Response {

    @JsonTypeInfo(use= JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="category")
    @JsonSubTypes({
            @Type(value = Series.class, name = "Series"),
            @Type(value = Movies.class, name = "Movies")})
    public static abstract class Asset {
        public String category;
        public String id;
    }

    public static class Series extends Asset {
        public String seriesName;
        public int seasonNumber;
    }

    public static class Movies extends Asset {
        public String movieName;
    }

    public Asset[] assets;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试反序列化以下JSON时,

{
    assets: [
        {
            "category": "Series",
            "id": "ID1",
            "seriesName": "SeriesName1",
            "seasonNumber": 1
        },
        {
            "category": "Movies",
            "id": "ID2",
            "movieName": "MovieName1"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我看到所有属性都被正确反序列化,但category属性除外,它们都null属于两种资产类型.

难道我做错了什么?或者这是预期的行为 - 在反序列化期间丢弃用于推断子类型的属性?

vov*_*kab 20

你需要设置visible = true:

@JsonTypeInfo(
    use= JsonTypeInfo.Id.NAME,
    include=JsonTypeInfo.As.PROPERTY,
    property="category",
    visible = true
)
Run Code Online (Sandbox Code Playgroud)


小智 2

是的,类别属性用于确定注释中声明的返回对象的类型。如果您仍然希望在反序列化对象中拥有该属性,您可以添加另一个属性以进行类型区分,或者编写一个不带类型元素的反序列化,如本文中的示例 6所示