2012-11-30 1 views
7

Sto prelevando un albero di categorie e articoli da un servizio REST. Le categorie hanno un attributo "figlio" che contiene un elenco di categorie e/o articoli. I loro tipi sono specificati nel campo "tipo".Deserializzazione polimorfa di Jackson 2.1: come popolare il campo di testo su pojo?

La gestione del tipo polimorfico di Jackson è eccezionale e funziona come previsto, tranne un piccolo intoppo: il campo "tipo" non è popolato. C'è un modo semplice per ottenere questi dati sui pojos? Spero di non dover scrivere deserializzatori personalizzati.

Ecco la classe base per Categoria e Articolo. Le due sottoclassi aggiungono diversi campi scalari e non sono molto interessanti.

@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 {} 
} 

sto facendo la deserializzazione di un qualcosa di ObjectMapper come questo:

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

Penso che sia così irrilevante che non merita nemmeno un tag, ma solo nel caso, questo è in un'app per Android.

risposta

10

Come al solito, ho trascorso alcuni minuti a cercare prima di pubblicare questa domanda per assicurarmi di non aver perso nulla di ovvio.

Non lo chiamerei ovvio, ma ho rintracciato a resolved jira ticket con la risposta. Il ticket è stato collegato nei commenti sotto un post su http://jackson-users.ning.com/, anche se ho perso il collegamento al post.

C'è un attributo "visibile" nell'annotazione JsonTypeInfo che fa proprio questo.

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

risulta, questo è documentato nelle javadocs. L'avevo perso grazie all'ottimo SEO sui vecchi 1.5 documenti (e la confusa dicotomia tra jackson.codehaus.org e fasterxml.com non aiuta), ma ora ho imparato la lezione e sto guardando i documenti qui: http://wiki.fasterxml.com/JacksonJavaDocs.

+1

Ottimo lavoro investigativo! – StaxMan

+0

Ranellato in questo esatto problema un paio di ore fa - hai salvato ciò che rimane dei miei capelli! tysm! – tbm