多态类型的Jackson反序列化

rqmkfv5c  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(101)

我看过一个Jackson反序列化@JsonTypeInfo的例子,就是:

@JsonTypeInfo(
    use = JsonTypeInfo.Id.NAME,
    include = JsonTypeInfo.As.PROPERTY,
    property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Cat.class, name = "cat"),
    @JsonSubTypes.Type(value = Dog.class, name = "dog")})
public class Animal {...}

我试过了,它工作得很好。现在,问题是在示例中,类Cat和Dog引用自Animal,这是我想避免的。有没有一种方法可以将类型绑定从Animal类中移走,并且仍然可以进行反序列化工作?谢谢

qojgxg4l

qojgxg4l1#

我在这里找到了答案:http://jira.codehaus.org/browse/JACKSON-654。所以我可以用途:

mapper.registerSubtypes(Cat.class, Dog.class);
rpppsulh

rpppsulh2#

完全删除@JsonSubTypes也值得一试。这并不总是必要的,参见https://stackoverflow.com/a/57686619/5298002
“你只需要在Animal类的声明前一行,就可以正确地进行多态序列化/反序列化:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
public abstract class Animal {
   ...
}

这一行的意思是:在序列化时添加一个元属性,或在反序列化时读取一个名为“@class”(property =“@class”)的元属性(include = JsonTypeInfo.As.PROPERTY),该属性保存完全限定的Java类名(use = JsonTypeInfo.Id.CLASS)。
所以,如果你直接创建一个JSON(没有序列化),记得添加一个元属性“@class”和所需的类名,以便正确的反序列化。
更多信息在这里“- @marco

相关问题