2016-08-01 10 views
0

Lassen Sie uns annehmen, dass wir die folgende Struktur haben:Man leite die genaue Klasse aus der Verpackung Klasse Jackson

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; 
} 

Mit der obigen Struktur I eine JSON mit Jackson speichern möchten. Die beiden möglichen JSONs, die ich brauche zu analysieren sind:

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

und

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

Hier ist mein Code, die ich verwenden, um die JSON deserialisieren:

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

Die einzige Sache ist, dass Ich weiß nicht, wie man den Typ von der "Basis" JSON bekommt. Die Syntax: ...property="BaseClass.typeOfSomeClass" sucht weiterhin nach einer Eigenschaft in der implementierenden SomeClassBasedOnType-Klasse. Irgendwelche Ideen, um zu spezifizieren, dass ich die Eigenschaft von der einwickelnden Klasse benötige?

Nur um die "Basis" JSON zu klären enthält viele Schlüssel, die alle gleich sind, einschließlich der Schlüssel someClassBasedOnType. Der Schlüssel someClassBasedOnType kann jedoch zwei verschiedene JSON-Objekte (mit unterschiedlichen Schlüsseln) enthalten. Die Unterscheidung dieser Objekte basiert auf dem Wert des Schlüssels in der JSON-Basis, typeOfSomeClass. Hier

+0

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

+0

Btw, Ich habe das Problem gelöst mit benutzerdefinierten Deserializer.Aber es sollte mehr "elegante" Lösung ... –

Antwort