一尘不染

用Jackson反序列化多态类型

json

如果我有这样的类结构:

public abstract class Parent {
    private Long id;
    ...
}

public class SubClassA extends Parent {
    private String stringA;
    private Integer intA;
    ...
}

public class SubClassB extends Parent {
    private String stringB;
    private Integer intB;
    ...
}

还有另一种反序列化的方法@JsonTypeInfo吗?在父类上使用此注释:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "objectType")

我不想强迫我的API的客户包括"objectType": "SubClassA"反序列化一个Parent子类。

@JsonTypeInfo杰克逊不是使用,而是提供了一种方法来注释子类并通过唯一属性将其与其他子类区分开来?在上面的示例中,这类似于“如果JSON对象"stringA": ...将其反序列化为SubClassA,如果它将其"stringB": ...反序列化为SubClassB”。


阅读 421

收藏
2020-07-27

共1个答案

一尘不染

感觉像是应该使用的东西@JsonTypeInfo@JsonSubTypes但是我在文档中进行了选择,可以提供的任何属性似乎都不符合您所描述的内容。

您可以编写自定义反序列化器,以@JsonSubTypes非标准的方式使用’“ name”和“
value”属性来完成所需的操作。反序列化器@JsonSubTypes将在基类中提供,而反序列化器将使用“名称”值检查属性的存在,如果存在,则将JSON反序列化为“值”属性中提供的类。您的课程将如下所示:

@JsonDeserialize(using = PropertyPresentDeserializer.class)
@JsonSubTypes({
        @Type(name = "stringA", value = SubClassA.class),
        @Type(name = "stringB", value = SubClassB.class)
})
public abstract class Parent {
    private Long id;
    ...
}

public class SubClassA extends Parent {
    private String stringA;
    private Integer intA;
    ...
}

public class SubClassB extends Parent {
    private String stringB;
    private Integer intB;
    ...
}
2020-07-27