2011-03-30 22 views
24

我想將JSON字符串轉換爲java對象,但該對象的類包含抽象字段,Jackson無法實例化,並且不會生成目的。什麼是告訴它的抽象類的一些默認實現最簡單的方法,像傑克遜JSON庫:如何實例化一個包含抽象字段的類

setDefault(AbstractAnimal.class, Cat.class); 

或者決定有關基於JSON的實現類屬性的名稱,例如。爲JSON對象:

{ 
    ... 
    cat: {...} 
    ... 
} 

我只想WITE:

setImpl("cat", Cat.class); 


我知道這是可能在傑克遜嵌入內部JSON類的信息,但我不希望JSON格式複雜我使用。我想決定只是通過設置默認的實現類,或屬性名稱(「貓」)使用什麼類 - 像XStream的圖書館,在那裏你寫:

xStream.alias("cat", Cat.class); 

有沒有辦法這樣做,特別是在一行中,還是需要更多的代碼?

+0

在Java中沒有像'抽象字段'那樣的東西。 – EJP 2011-03-30 23:15:01

+1

我的意思是: 'class C {animal animal; }' 我想實例化C,其中Aniaml是抽象的,我想在這個字段中放入一個Cat,它擴展了Animal – Marcin 2011-03-31 07:07:39

+0

,所以沒有問題。對於抽象類型的變量沒有規則。 – EJP 2011-04-05 10:47:59

回答

36

有多種方式; 1.8版本之前,最簡單的方法可能是要做到:

@JsonDeserialize(as=Cat.class) 
public abstract class AbstractAnimal { ... } 

如在決定基於屬性,這是最好的做用@JsonTypeInfo,它不自動embeddeding(寫入時)和使用的類型信息。

有多種類型的信息(類名稱,邏輯類型名稱)以及包含機制(as-included-property,as-wrapper-array,as-wrapper-object)。本頁面:https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization解釋了一些概念。

+0

評論感謝您的答案! @JsonDeserialize是我的問題的理想之處,因爲它不需要在JSON中嵌入任何類型的信息。但是我不能使用它,因爲我不能修改我想要實例化的類,因爲它們是其他項目的一部分,並且更改此代碼可能會破壞其他代碼。 – Marcin 2011-04-06 13:39:01

+4

註解也非常不靈活,因爲我無法動態地決定我使用的實現。 – Marcin 2011-04-06 13:47:38

+1

Wrt修改類,這是傑克遜混合註釋的目的。但是正確的,這個註釋僅僅用於只有一種實現類型的情況。 Jackson 1.8將具有允許簡單的抽象類型 - > impl類型映射的功能,以實現其價值。 – StaxMan 2011-04-08 01:09:44

2

一個非常明顯的例子,一個羽翼豐滿的答案可以在這裏找到:https://stackoverflow.com/a/30386694/584947

傑克遜稱此爲多態反序列化。

它肯定幫我解決了我的問題。我有一個抽象類,我保存在數據庫中,需要將它解組到一個類的具體實例(可以理解)。

它將向您展示如何正確註釋父級抽象類以及如何在解組時運行時教授傑克遜如何在可用的子類候選中進行選擇。

相關問題