2016-08-01 29 views
0

讓我們假設我們有以下結構:派生的確切類從包裝類傑克遜

class BaseClass { 
    ... 
    String typeOfSomeClass; 
    SomeClassBasedOnType someClassBasedOnType; 
} 

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=As.PROPERTY, property="BaseClass.typeOfSomeClass") 
@JsonSubTypes({ 
    @Type(value = SomeClassBasedOnTypeImpl1.class, name="type1"), 
    @Type(value = SomeClassBasedOnTypeImpl2.class, name="type2") 
}) 
interface SomeClassBasedOnType { 
} 
@JsonTypeName("type1") 
class SomeClassBasedOnTypeImpl1 implements SomeClassBasedOnType { 
    String str1; 
} 
@JsonTypeName("type2") 
class SomeClassBasedOnTypeImpl2 implements SomeClassBasedOnType { 
    String str2; 
} 

通過上述結構我想存儲使用傑克遜JSON。我需要解析兩種可能JSONs是:

{"typeOfSomeClass":"type1", "someClassBasedOnType": {"str1":"someValue"}} 

{"typeOfSomeClass":"type2", "someClassBasedOnType": {"str2":"someValue"}} 

這裏是我的代碼,我用它來反序列化JSON:

BaseClass baseClass = new ObjectMapper().readValue(someJsonAsString, BaseClass.class); 

的唯一的事情是,我不知道如何從「基礎」JSON獲取類型。語法:...property="BaseClass.typeOfSomeClass"仍然在SomeClassBasedOnType實現類中查找屬性。任何想法如何指定我需要包裝類的屬性?

只是爲了闡明「基礎」JSON包含許多鍵,它們都是相同的,包括鍵someClassBasedOnType。然而,關鍵字someClassBasedOnType可能包含兩個不同的JSON對象(具有不同的鍵),區分這些對象的方式是基於名爲typeOfSomeClass的「基礎」JSON中的鍵的值。

+0

涉及: http://stackoverflow.com/questions/38657521/derive-the-exact -class-of-the-wrapper-class-gson –

+0

順便說一句,我已經解決了使用自定義Deserializer的問題。但是應該有更多「優雅」的解決方案... –

回答