2013-02-05 11 views
5

mam tego modelu JSON klasę,Jackson polimorficzny typu manipulacja - nieruchomość wyrzucić

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

Kiedy próbuję deserializowania następujące JSON,

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

widzę, że wszystkie właściwości są prawidłowo rozszeregować, z wyjątkiem własności category, które są w obu typach zasobów.

Czy robię coś nie tak? Czy jest to oczekiwane zachowanie - właściwość używana do wnioskowania podtypu jest odrzucana podczas deserializacji?

+0

ty także kontrolować na serializacji? Mam na myśli, jeśli możesz dodać inne właściwości do strumienia json – eugen

+0

@eugen Nie mam kontroli nad serializacją. Myślę, że dodanie typu dyskryminatora w podtypach jest łatwiejszą drogą. – zihaoyu

Odpowiedz

2

Tak, właściwość kategorii służy do określania typu zwróconego obiektu zgodnie z zadeklarowaną adnotacją. Jeśli nadal chcesz mieć tę właściwość w swoich deserializowanych obiektach, możesz dodać inną właściwość dla dyskryminacji typów lub zapisać deserializację bez elementu typu, jak w przykładzie 6 z tego post.

+0

Dzięki, myślę, że dodanie dyskryminatora typu w podtypach jest łatwiejszą drogą. – zihaoyu

+1

Ale dlaczego chcesz tej nieruchomości? Jackson dodaje już "kategorię" w JSON i jeśli nie masz konkretnej dodatkowej potrzeby, nie potrzebujesz właściwości POJO o tej nazwie. – StaxMan

18

Musisz ustawić widoczny = true:

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

Dokładnie to, czego potrzebowałem, mam wyliczenie, które jest potrzebne w moim POJO, ale byłby ustawiony na wartość NULL po wybraniu podtypu. Ustawienie visible = true zachowuje oryginalną wartość. – Limnic

+0

Domyślam się, że powinno być widoczne = true, dlaczego nie ?! Dziękuję za odpowiedź –