【问题标题】:How to deserialize a json array containing different types of objects如何反序列化包含不同类型对象的json数组
【发布时间】:2016-12-16 23:41:42
【问题描述】:

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

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

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

我提到了这个question。但是我无法更改我要包含的 json,按照那里的建议包含一个“类型”,然后对两个不同对象的 POJO 使用继承。

【问题讨论】:

  • 只需创建一个自定义解串器,它会根据key 进行切换。
  • @BoristheSpider 不需要自定义反序列化器 :)

标签: java json jackson


【解决方案1】:

不需要自定义反序列化程序。聪明的@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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多