如何反序列化包含不同类型对象的json数组

时间:2016-08-10 14:15:38

标签: java json jackson

这是一个json片段,其中包含一个数组(图标),可以包含两种不同类型的对象(应用程序和文件夹)

    {
        "icons": [{
            "application": {
                "displayName": "Facebook",
                "bundleId": "com.facebook.com"
            }
        }, {
            "folder": {
                "some": "value",
                "num": 3
            }
        }]
    }

如何创建java POJO对这种json进行建模然后反序列化?

我提到了这个question。但我不能改变json我要包含一个'类型'按照那里的建议然后使用继承来处理两个不同对象的POJO。

1 个答案:

答案 0 :(得分:5)

不需要自定义反序列化器。聪明的@JsonTypeInfo可以解决问题。

见下面的类和接口:

@JsonTypeInfo(use = Id.NAME, include = As.WRAPPER_OBJECT)
@JsonSubTypes({ @Type(value = ApplicationIcon.class, name = "application"),
                @Type(value = FolderIcon.class, name = "folder") })
public interface Icon {

}
@JsonRootName("application")
public class ApplicationIcon implements Icon {

    public String displayName;
    public String bundleId;

    // Getters and setters ommited
}
@JsonRootName("folder")
public class FolderIcon implements Icon {

    public String some;
    public Integer num;

    // Getters and setters ommited
}
public class IconWrapper {

    private List<Icon> icons;

    // Getters and setters ommited
}

要反序列化您的JSON,请执行以下操作:

String json = "{\"icons\":[{\"application\":{\"displayName\":\"Facebook\",\"bundleId\":\"com.facebook.com\"}},{\"folder\":{\"some\":\"value\",\"num\":3}}]}";

ObjectMapper mapper = new ObjectMapper();
IconWrapper iconWrapper = mapper.readValue(json, IconWrapper.class);