2013-02-05 1 views
5

ho questa classe del modello JSON,Jackson Tipo polimorfico trattamento - proprietà scartato

public class Response { 

    @JsonTypeInfo(use= JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="category") 
    @JsonSubTypes({ 
      @Type(value = Series.class, name = "Series"), 
      @Type(value = Movies.class, name = "Movies")}) 
    public static abstract class Asset { 
     public String category; 
     public String id; 
    } 

    public static class Series extends Asset { 
     public String seriesName; 
     public int seasonNumber; 
    } 

    public static class Movies extends Asset { 
     public String movieName; 
    } 

    public Asset[] assets; 
} 

Quando provo a deserializzare il seguente JSON,

{ 
    assets: [ 
     { 
      "category": "Series", 
      "id": "ID1", 
      "seriesName": "SeriesName1", 
      "seasonNumber": 1 
     }, 
     { 
      "category": "Movies", 
      "id": "ID2", 
      "movieName": "MovieName1" 
     } 
    ] 
} 

vedo che tutte le proprietà sono deserializzate correttamente, ad eccezione della proprietà category, che sono null in entrambi i tipi di asset.

Sto facendo qualcosa di sbagliato? O è questo il comportamento atteso - la proprietà che viene usata per dedurre il sottotipo viene scartata durante la deserializzazione?

+0

non si ha il controllo anche sulla serializzazione? Voglio dire se puoi aggiungere altre proprietà nel flusso json – eugen

+0

@eugen Non ho il controllo sulla serializzazione. Penso che aggiungere un discriminatore di tipo nei sottotipi sia la strada più facile da percorrere. – zihaoyu

risposta

2

Sì, la proprietà della categoria viene utilizzata per determinare il tipo dell'oggetto restituito come dichiarato nell'annotazione. Se vuoi ancora avere quella proprietà nei tuoi oggetti deserializzati, puoi aggiungere un'altra proprietà per la discriminazione di tipo o scrivere una deserializzazione senza elemento di tipo come nell'esempio 6 da questo post.

+0

Grazie, penso che aggiungere un discriminatore di tipo nei sottotipi è la strada più facile da percorrere. – zihaoyu

+1

Ma perché vuoi quella proprietà? Jackson aggiunge già la "categoria" in JSON e, a meno che tu non abbia esigenze aggiuntive specifiche, non hai bisogno di una proprietà POJO con quel nome. – StaxMan

18

È necessario impostare visibile = true:

@JsonTypeInfo(
    use= JsonTypeInfo.Id.NAME, 
    include=JsonTypeInfo.As.PROPERTY, 
    property="category", 
    visible = true 
) 
+0

Esattamente ciò di cui avevo bisogno, ho un enum necessario nel mio POJO, ma sarebbe stato impostato su null dopo la selezione del sottotipo. Setting visible = true mantiene il suo valore originale. – Limnic

+0

Suppongo che dovrebbe essere visibile = true per impostazione predefinita, perché no ?! Grazie per la risposta –