2015-07-26 16 views
12

cấu trúc JSON của tôi:JsonSubTypes, danh sách các đối tượng polymorpic và Parcelable

{ 
    ... 
    "type":"post", // Type could vary 
    "items":[]  // Array of items, each item is typeOf("type") 
    ... 
} 

Làm thế nào tôi có thể deserialize và bưu kiện đúng danh sách items bên POJO tôi:

public class ItemsEnvelope { 
    private String type; 

    @JsonTypeInfo(
      use = JsonTypeInfo.Id.NAME, 
      include = JsonTypeInfo.As.EXTERNAL_PROPERTY, 
      property = "type", 
      visible = true) 
    @JsonSubTypes({ 
      @JsonSubTypes.Type(value = A.class, name = "A"), 
      @JsonSubTypes.Type(value = B.class, name = "B"), 
      @JsonSubTypes.Type(value = C.class, name = "C") 
    }) 
    private List<Item> items; 

    interface Item extends Parcelable {} 

    class A implements Item { 
     // Bunch of getters/setters and Parcelable methods/constructor 
    } 

    class B implements Item { 
     // Bunch of getters/setters and Parcelable methods/constructor 
    } 

    class C implements Item { 
     // Bunch of getters/setters and Parcelable methods/constructor 
    } 

    // Bunch of getters/setters and Parcelable methods/constructor 
} 

Để bưu kiện danh sách gõ một đối tượng CREATOR nên được cung cấp, một giao diện, rõ ràng là không thể có. Tôi có nên sử dụng lớp trừu tượng thay vì giao diện không?

Trả lời

0

Vâng, vì Jackson dự kiến ​​sẽ nhập thông tin vào từng phần tử danh sách và tôi không muốn viết một trình chỉnh sửa tùy chỉnh để làm nổi bật POJO này - tôi đã giải quyết nó theo cách khác.

Trước hết, tôi đã làm một giao diện mà tất cả các mục con của tôi phải triển khai.

@JsonTypeInfo(
     use = JsonTypeInfo.Id.NAME, 
     include = JsonTypeInfo.As.EXTERNAL_PROPERTY, 
     property = "type", 
     visible = true) 
@JsonSubTypes({ 
     @JsonSubTypes.Type(value = PostFeedItem.class, name = BaseFeedItem.TYPE_POST), 
     @JsonSubTypes.Type(value = PhotoFeedItem.class, name = BaseFeedItem.TYPE_PHOTO), 
     @JsonSubTypes.Type(value = AudioFeedItem.class, name = BaseFeedItem.TYPE_AUDIO), 
     @JsonSubTypes.Type(value = VideoFeedItem.class, name = BaseFeedItem.TYPE_VIDEO), 
     @JsonSubTypes.Type(value = FriendFeedItem.class, name = BaseFeedItem.TYPE_FRIEND) 
}) 
public interface FeedItem extends Parcelable { 
    // ... 
    @BaseFeedItem.Type 
    String getType(); 
    // ... 
} 

Sau đó, tôi đã tạo một lớp cơ sở, tất cả các mục phụ của tôi phải mở rộng.

public abstract class BaseFeedItem implements FeedItem { 
    public static final String TYPE_POST = "post"; 
    public static final String TYPE_COMMUNITY_POST = "group_post"; 
    public static final String TYPE_PHOTO = "photo"; 
    public static final String TYPE_AUDIO = "audio"; 
    public static final String TYPE_VIDEO = "video"; 
    public static final String TYPE_FRIEND = "friend"; 

    @Retention(RetentionPolicy.SOURCE) 
    @StringDef({TYPE_POST, TYPE_COMMUNITY_POST, TYPE_PHOTO, TYPE_AUDIO, TYPE_VIDEO, TYPE_FRIEND}) 
    public @interface Type {} 
    private String type; 

    @Type 
    public String getType() { 
     return type; 
    } 
    // ... 
} 

Cuối cùng, lớp POJO tôi:

public class NewsFeedEnvelope { 
    // ... 
    @JsonProperty("rows") 
    private List<FeedItem> items; 
    // ... 
} 

Bây giờ POJO được thành công tự động deserialized bởi Jackson mà không cần bất kỳ deserializers tùy chỉnh.

0

Điều đầu tiên trước tiên: EXTERNAL_PROPERTY sẽ chỉ hoạt động khi giá trị được đặt trong một đối tượng khác (POJO); và sẽ không hoạt động cho List s, mảng hoặc Map s.

Nếu bạn đang sử dụng một trong các phương pháp bao gồm khác, mọi thứ sẽ hoạt động ở chỗ bạn có thể tuần tự hóa nội dung dưới dạng JSON và đọc các loại giữ lại JSON được sản xuất như mong đợi. Tức là, serialization trip-round được hỗ trợ khi bắt đầu với các đối tượng Java. Ngoài điều này, một số cấu trúc mã hóa JSON có thể được hỗ trợ; nhưng nó phụ thuộc vào loại cấu trúc chính xác mà bạn đang cố gắng hỗ trợ.

+0

Đã thêm cấu trúc json vào câu hỏi. Tôi nên sử dụng phương pháp bao gồm trong trường hợp của tôi? – localhost

+0

Không có cách nào để chỉ ra các loại của tất cả các phần tử của một mảng JSON; Jackson dự kiến ​​sẽ nhập thông tin về từng phần tử. Vì vậy, để hỗ trợ sắp xếp này, bạn sẽ cần phải viết một deserializer tùy chỉnh (và serializer nếu bạn muốn tạo JSON như vậy). – StaxMan

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