2013-02-05 35 views
5

Tôi có lớp mô hình JSON này,Jackson kiểu đa hình xử lý - tài sản bỏ đi

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

Khi tôi cố gắng deserialize JSON sau,

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

tôi thấy rằng tất cả các thuộc tính được deserialized đúng cách, ngoại trừ thuộc tính category, là null trong cả hai loại nội dung.

Tôi có làm gì sai không? Hay đây là hành vi mong đợi - tài sản được sử dụng để suy luận loại con được loại bỏ trong quá trình deserialization?

+0

Bạn cũng đã kiểm soát trên serialization? Tôi có nghĩa là nếu bạn có thể thêm các thuộc tính khác vào dòng json – eugen

+0

@eugen Tôi không có quyền kiểm soát việc tuần tự hóa. Tôi nghĩ rằng thêm một loại phân biệt đối xử trong các loại phụ là cách dễ dàng hơn để đi. – zihaoyu

Trả lời

2

Có, thuộc tính danh mục được sử dụng để xác định loại đối tượng được trả về như được khai báo trong chú thích. Nếu bạn vẫn muốn có thuộc tính đó trong các đối tượng deserialized của mình, bạn có thể thêm một thuộc tính khác cho phân biệt kiểu hoặc viết deserialization mà không có phần tử type như trong ví dụ 6 từ post này.

+0

Cảm ơn, tôi nghĩ rằng thêm một loại phân biệt đối xử trong các loại phụ là cách dễ dàng hơn để đi. – zihaoyu

+1

Nhưng tại sao bạn muốn tài sản đó? Jackson đã thêm 'danh mục' vào JSON và trừ khi bạn có nhu cầu bổ sung cụ thể, bạn không cần thuộc tính POJO của tên đó. – StaxMan

18

Bạn cần phải thiết lập có thể nhìn thấy = true:

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

Chính xác những gì tôi cần, tôi có một enum là cần thiết trong POJO của tôi, nhưng nó sẽ được thiết lập để null sau khi subtype đã được chọn. Cài đặt hiển thị = true giữ giá trị ban đầu của nó. – Limnic

+0

Tôi giả sử sẽ được hiển thị = true theo mặc định, tại sao không ?! Cảm ơn về câu trả lời –

Các vấn đề liên quan