Jackson多态性:如何将多个子类型映射到同一个类

我正在使用Jackson 1.9.x. 坚持动物的例子,这就是我想做的事情:

假设我有一个Animal类:

public class Animal { private String type; // accessors } public class Mammal extends Animal { private String diet; // accessors } public class Bird extends Animal { private boolean tropical; // accessors } 

我希望能够做到这样的事情(我将一些子类型映射到一个类,并将一些子类型映射到另一个类):

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

我现在看到的是jackson只会识别狗对哺乳动物和渡渡鸟对鸟的映射。 这是因为StdSubtypeResolver._collectAndResolve()只允许同一个类注册一次(由于NamedType.equals()的实现)。

我看到的问题是否有解决方法?

也许不是通过使用注释。 问题来自于这样的映射不适用于序列化,并且现有映射确实期望一对一(双射)关系。 但您可能想在jackson-databind问题跟踪器上提交RFE; 添加支持可能是可能的。

该漏洞已在2.6.0版本中得到解决,因此您只需将Jackson更新到2.6.0或更高版本即可。 附加信息在这里和这里 。

我也面临同样的问题,发现Subtype映射需要唯一的类。

我所做的是创建两个扩展相同基类的类。 扩展类为空,因为它们具有与基类相同的属性。 然后将它们添加到子类型映射中。 例如,在您的情况下,它将是 –

 @JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type") @JsonSubTypes({@JsonSubTypes.Type(value = Mammal.class, name = "Dog"), @JsonSubTypes.Type(value = Mammal.class, name = "Cat"), @JsonSubTypes.Type(value = BirdDodo.class, name = "Dodo"}, @JsonSubTypes.Type(value = BirdCockatoo.class, name = "Cockatoo"}) public class Animal { } public class BirdCockatoo extends Cockatoo{} public class BirdDodo extends Dodo{} 

我知道这不是最好的方法,但在问题得不到解决之前,它可能是解决这个问题的最佳方法。 我现在一直遵循这种方法。

希望它能帮到你!