2012-08-03 3 views
42

Ich würde gerne wissen, ob @JsonTypeInfo Annotation für Schnittstellen verwendet werden kann. Ich habe eine Reihe von Klassen, die serialisiert und deserialisiert werden sollten.Polymorphismus in Jackson Annotationen: @JsonTypeInfo Verwendung

Hier ist, was ich versuche zu tun. Ich habe zwei Implementierungsklassen Sub1, Sub2 Implementierung MyInt. Einige der Modellklassen haben die Schnittstellenreferenz für die Implementierungstypen. Ich möchte die Objekte deserialisieren basierend auf Polymorphismus

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=As.WRAPPER_OBJECT) 
@JsonSubTypes({ 
    @Type(name="sub1", value=Sub1.class), 
    @Type(name="sub2", value=Sub2.class)}) 
public interface MyInt{ 
} 

@JsonTypeName("sub1") 
public Sub1 implements MyInt{ 
} 

@JsonTypeName("sub2") 
public Sub2 implements MyInt{ 
} 

ich folgendes JsonMappingException erhalten:

unerwartetes Token (END_OBJECT), erwartet FIELD_NAME: need JSON String , die Typ-ID

enthält
+0

Sie haben dies gesehen? http://jackson-users.ning.com/forum/topics/mapper-not-include-type-information-when-serializing-object-why?xg_source=activity Haben Sie eine Liste ohne Typ wie erwähnt in der anderen erwähnt Faden? –

+1

Ich denke, Sie müssen etwas mehr Code zeigen (wie Serialisierung, Deserialisierung durchgeführt wird), sowie JSON produziert/verbraucht wird. – StaxMan

Antwort

40

@ JsonSubTypes.Type muss einen Wert und einen Namen wie diesen haben,

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=As.WRAPPER_OBJECT, property="type") 
    @JsonSubTypes({ 

     @JsonSubTypes.Type(value=Dog.class, name="dog"), 

     @JsonSubTypes.Type(value=Cat.class, name="cat") 

    }) 

In der Unterklasse verwenden Sie @JsonTypeName("dog"), um den Namen zu sagen.

Die Werte 'Hund' und 'Katze' werden in der Eigenschaft 'Typ' festgelegt.

+0

Danke für die Antwort. Allerdings bekomme ich immer noch den gleichen Fehler. Denkst du, ich sollte auch etwas in @JsonTypeInfo ändern? – Chris

+2

Weiß jemand, ob JsonTypeInfo überhaupt auf Schnittstellen angewendet werden kann? – Chris

+0

Problem könnte mit Ihrer Eingabe-JSON-Zeichenfolge sein. versuchst du etwas zu posten? –