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()的实现).
我看到的问题是否有解决方法?
我也遇到了同样的问题,发现子类型映射需要唯一的类。
我所做的是创建两个扩展相同基类的类。扩展类是空的,因为它们与基类具有相同的属性。然后将它们添加到子类型映射中。例如,在您的情况下,它将是-
@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)
我知道这不是最好的方法,但在问题未解决之前,它可能是解决此问题的最佳方法。我暂时遵循这种方法。
希望对你有帮助!
也许不是通过使用注释。问题来自这样的事实:此类映射不适用于序列化,并且现有映射确实期望一对一(双射)关系。但您可能需要在jackson-databind 问题跟踪器提交 RFE ;增加支持是可能的。
归档时间: |
|
查看次数: |
11142 次 |
最近记录: |