2012-11-30 9 views
7

Ich ziehe einen Baum von Kategorien und Elementen aus einem REST-Service. Kategorien haben ein Attribut "Kind", das eine Liste von Kategorien und/oder Elementen enthält. Ihre Typen sind im Feld "Art" angegeben.Jackson 2.1 polymorphe Deserialisierung: Wie Typ Feld auf Pojo zu füllen?

Jacksons polymorphe Typ Handhabung ist groß und alle wie erwartet, mit Ausnahme eines kleinen Haken: die „Art“ selbst das Feld nicht belegt ist. Gibt es eine einfache Möglichkeit, diese Daten auf die Pojos zu bekommen? Ich hoffe, dass ich keine benutzerdefinierten Deserializer schreiben muss. Hier

ist die Basisklasse für Kategorie und Artikel. Die zwei Unterklassen fügen mehrere skalare Felder hinzu und sind nicht sehr interessant.

@JsonIgnoreProperties(ignoreUnknown=true) 
@JsonTypeInfo( 
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "kind", 
    defaultImpl = EntityBase.Impl.class 
    ) 
@JsonSubTypes({ 
    @Type(value = Item.class, name = "Item"), 
    @Type(value = Category.class, name = "Category") 
    }) 
public abstract class EntityBase { 
    String title; 
    String kind; 

    public void setTitle(String title) { this.title = title; } 
    public String getTitle() { return title; } 

    public void setKind(String kind) { this.kind = kind; } 
    public String getKind() { return kind; } 

    public static class Impl extends EntityBase {} 
} 

Ich mache das Deserialisierungsereignis mit einem ObjectMapper etwas wie folgt aus:

ObjectMapper mapper = new ObjectMapper(); 
Category category = mapper.readValue(inputStream, Category.class); 

Ich denke, es ist so irrelevant ist, dass es nicht einmal einen Tag nicht verdient, aber nur für den Fall, das ist in eine Android App

Antwort

10

Wie üblich, verbrachte ich ein paar Minuten suchen, kurz bevor diese Frage Entsendung sicherzustellen, dass ich offensichtlich nichts verpasst hatte.

Ich würde es nicht auf der Hand nennen, aber ich aufgespürt a resolved jira ticket mit der Antwort. Das Ticket wurde in Kommentaren unter einem Beitrag auf http://jackson-users.ning.com/ verlinkt, obwohl ich den Link zum Post verloren habe.

Es gibt ein „sichtbares“ Attribut auf der JsonTypeInfo Anmerkung, die genau dies tut.

@JsonTypeInfo( 
    use = JsonTypeInfo.Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "kind", 
    visible = true,     // <----- add this 
    defaultImpl = EntityBase.Impl.class 
    ) 
public abstract class EntityBase { 
    ... 
} 

Es stellt sich heraus, wird dies dokumentiert in dem javadocs. Ich hatte es dank der exzellenten SEO auf den alten 1.5 Dokumenten verpasst (und die verwirrende Dichotomie zwischen jackson.codehaus.org und fasterxml.com hilft nicht), aber jetzt habe ich meine Lektion gelernt und ich schaue mir die Dokumentation an hier: http://wiki.fasterxml.com/JacksonJavaDocs.

+1

Ausgezeichnete detektivische Arbeit! – StaxMan

+0

Vor ein paar Stunden ist dieses Problem aufgetaucht - du hast gerettet, was von meinen Haaren übrig geblieben ist! Tysm! – tbm

Verwandte Themen