2013-08-23 28 views
10

我正在使用Jackson 1.9.x. 與動物例如堅持,這是我想做什麼:Jackson多態性:如何將多個亞型映射到相同的類

比方說,我有一個動物類:

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 { 

} 

我所看到的現在的問題是,傑克遜將只認狗對哺乳動物和渡渡鳥到鳥映射。這是因爲StdSubtypeResolver._collectAndResolve()只允許同一個類註冊一次(由於NamedType.equals()的實現)。

有沒有解決我看到的問題的解決方法?

+0

[This](http://www.cowtowncoder.com/blog/archives/2010/03/entry_372.html)似乎相關... – jahroy

+0

我將StaxMan的答案標記爲接受的答案,但它實際上是這是他在後續討論中我打算實施的想法。目前我還沒有計劃將RFE提交給傑克遜數據綁定問題跟蹤器。 –

回答

3

也許不使用註釋。問題來自於這樣的映射不適用於序列化,並且現有的映射確實期望一對一(雙向)關係。 但您可能想要提交RFE jackson-databind issue tracker;增加支持可能是可能的。

+0

感謝StaxMan。我是否認爲你是傑克遜的主要作者?我想到的一件事情,但沒有真正探索的是使用自定義Deserializer + TypeDeserializer。這會幫助我嗎?你期望我遇到什麼樣的問題? –

+0

對不起,我是主要作者。是的,自定義類型(de)序列化程序是您真正需要的(或者說,綁定到/從類型ID);默認的串行器/解串器絕對應該不做任何修改。類型id處理是按設計模塊化的,以支持不同的包含方法等。 – StaxMan

+1

剛剛創建了與此相關的問題,因爲我在同一問題中運行 – TheBakker

2

我也遇到了同樣的問題,發現子類型映射需要唯一的類。

我所做的是創建兩個擴展相同基類的類。擴展類是空的,因爲它們具有與基類相同的屬性。然後將它們添加到子類型地圖。 例如,你的情況,這將是 -

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

我明白這是不是最好的辦法,但直到問題沒有解決,它可能是解決這一問題的最佳途徑。我現在就採用這種方法。

希望它可以幫助你!

3

該錯誤已在2.6.0版本中得到解決,因此您只需更新Jackson版本2.6.0或更高版本。附加信息是herehere

相關問題