我使用的是Jackson1.9.x。坚持使用Animals示例,下面是我想做的:
假设我有一个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
}
我希望能够做这样的事情(我将几个子类型Map到一个类,再将几个子类型Map到另一个类):
@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只会识别Dog-to-Mammal和Dodo-to-BirdMap。这是因为StdSubtypeResolver._collectAndResolve()只允许同一个类注册一次(由于NamedType.equals()的实现)。
对于我看到的问题,是否有解决方法?
5条答案
按热度按时间2nbm6dog1#
我也遇到了同样的问题,发现子类型Map需要唯一的类。
我所做的是创建两个类,它们扩展了同一个基类。扩展类是空的,因为它们与基类具有相同的属性。然后将它们添加到SubtypeMap中。例如,在您的情况下,它将是-
我知道这不是最好的方法,但在问题没有解决之前,这可能是解决这个问题的最好方法。
希望对你有帮助!
c86crjj02#
该错误已在 2.6.0 版本中解决,因此您只需将Jackson更新到 2.6.0 或更高版本。附加信息为here和here。
cbjzeqam3#
也许不是通过使用注解。问题来自这样一个事实,即这种Map不适用于序列化,现有的Map确实期望一对一(双射)关系。可以添加支撑。
zynd9foi4#
你可以引入一个中间层的抽象类。
您也可以避免列出整个子类型列表,而使用
@JsonTypeName
。这个解决方案是IMHO更ellegant,因为
操作指南
默认情况下,Jackson不会遍历类型树来查找嵌套的子类型。它将失败,并显示:
无法将类型ID“Dodo”解析为
ch.zizka.test.Animal
:已知类型ids = [com.zizka.test.Bird,... Mammal]...at [Source:(byte[])"{
您需要将
@JsonSubTypes
添加到中间层类(Bird
,Mammal
)。结果
Animal
与@JsonTypeInfo(use=NAME)
Mammal
与@JsonSubTypes(@Type(Dog.class, Cat.class))
Dog
与@JsonTypeName("Dog")
Cat
与@JsonTypeName("Cat")
Bird
与@JsonSubTypes(@Type(Dodo.class, Cockatoo.class))
Dodo
与@JsonTypeName("Dodo")
Cockatoo
与@JsonTypeName("Cockatoo")
刚刚测试- #WORKSFORME.(Jackson2.10.5)
v9tzhpje5#
从Jackson2.12开始,
@JsonSubTypes.Type
注解中有一个单独的字段。检查下面的示例代码。