Java 使用基于键的类型名反序列化多形态JSON类型

Java 使用基于键的类型名反序列化多形态JSON类型,java,json,jackson,Java,Json,Jackson,下面是我想用Jackson反序列化的JSON示例 { "person": { "contacts": { "address": { "type": "Office", "street": "1600 Amphitheatre Parkway", "city": "Mountain View", "state": "CA", "zip": "94043", "country":

下面是我想用Jackson反序列化的JSON示例

{
  "person": {
    "contacts": {
      "address": {
        "type": "Office",
        "street": "1600 Amphitheatre Parkway",
        "city": "Mountain View",
        "state": "CA",
        "zip": "94043",
        "country": "United States"
      },
      "email": {
        "type": "Home",
        "emailAddress": "e.schmidt@google.com"
      },
      "phone": [
        {
          "type": "Mobile",
          "phoneNumber": "+1 888 555555"
        },
        {
          "type": "Home",
          "phoneNumber": "+1 888 1111111"
        }
      ],
      "website": {
        "type": "work",
        "webService": "URL",
        "webAddress": "www.google.com"
      }
    },
    "firstName": "Eric",
    "lastName": "Schmidt"
  }
}
这里需要反序列化的棘手部分是contacts节点。 注意事项:

  • contacts是一种多态抽象类型(参见下面的POJO)
  • 类型信息(例如,`addresss)作为密钥包含在包装器中
  • 如果只有一个值(
    电子邮件
    地址
    网站
    或一个数组(如果有多个(
    电话
    ),则此包装可以是对象
  • 目标POJO:

    public class Person
    {
        public String firstName;
        public String LastName;
        public List<Contact> contacts; // mixes Address, Phone, Email, Website
    }
    
    public abstract class Contact {
        public Long id;
    }
    
    public class Phone extends Contact
    {
        public String type;
        public String phoneNumber;
    }
    
    // other subtypes of Contact omitted for brevity
    
    公共类人物
    {
    公共字符串名;
    公共字符串LastName;
    公开列出联系人;//混合地址、电话、电子邮件和网站
    }
    公共抽象类联系人{
    公共长id;
    }
    公共类电话延长了联系时间
    {
    公共字符串类型;
    公共字符串电话号码;
    }
    //为简洁起见,省略了接触的其他子类型
    
    注意:外部需求要求我使用抽象的
    联系人
    类型。我宁愿直接反序列化到这些POJO,而不是让联系人类型挂起的中间
    联系人
    POJO在另一个步骤中手动映射/转换到我的列表

    我已经研究了许多其他jackson+多态反序列化问题,但似乎没有一个能够处理这个问题(特别是第2和第3个问题)

    我想将联系人对象反序列化为
    列表

    要实现这一点,正确应用
    @JsonTypeInfo
    @JsonSubTypes
    需要什么


    (如果有人对此感兴趣)

    您需要编写一个自定义反序列化程序并向Jackson注册。实现将检查初始启动,然后进行相应的解析。考虑sax风格的处理。

    检查此链接以从json生成java类,并进行必要的更改感谢提示,但是该站点生成了一个
    联系人
    POJO,这是我试图通过利用Jackson的多态特性来避免的中间映射/转换。将联系人亲自更改为Object,而不是class,这样你就可以稍后键入cast,并接受此作为答案,因为这似乎是满足我最初要求的唯一可能的解决方案。最后,我将JSON解析为中间POJO,然后手动将其转换为我想要的类型树。