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

Yah*_*adi 10 java json 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
}
Run Code Online (Sandbox Code Playgroud)

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

@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 {

}
Run Code Online (Sandbox Code Playgroud)

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

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

erk*_*fel 7

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


hka*_*era 6

我也遇到了同样的问题,发现子类型映射需要唯一的类。

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

@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{}
Run Code Online (Sandbox Code Playgroud)

我知道这不是最好的方法,但在问题未解决之前,它可能是解决此问题的最佳方法。我暂时遵循这种方法。

希望对你有帮助!


Sta*_*Man 4

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

  • 提供问题的链接可能会有所帮助。 (3认同)