使用基于键的类型名称反序列化polypmorphic JSON类型

时间:2017-01-17 13:12:51

标签: java json 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节点。 注意事项:

  1. contacts是一种多态抽象类型(请参阅下面的POJO)
  2. 类型信息(例如,`addresss)被包含为包装器中的键
  3. 如果只有一个值(emailaddresswebsite OR 一个数组(如果有多个),则此包装器可以是一个对象({ {1}})
  4. 目标POJO:

    phone

    注意:外部要求要求我使用抽象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 类型。我宁愿直接反序列化这些POJO ,而不是让联系人类型挂起的中间Contact POJO,并在另一步骤中手动映射/转换到我的列表。

    我查看了许多其他杰克逊+多态反序列化问题,但似乎没有人处理这种情况(特别是#2和#3)。

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

    实现此目的所需的List<Contact>@JsonTypeInfo的正确应用是什么?

    (如果有人有兴趣,这是CapsuleCRM's JSON format

1 个答案:

答案 0 :(得分:1)

您需要编写自定义反序列化程序并将其注册到Jackson。实现将检查初始启动然后相应地解析。想想萨克斯风格的处理。