在 REST 中解组复合对象 API

Unmarshalling of Composite Objects in REST API

我有以下数据结构:

    class User {
      String name;
      ContactDetails contactDetails;
    }

    class ContactDetails {
      String street;
      String area;
    }

    class PersonalContactDetails extends ContactDetails {
      String mobileNumber;
    }

    class OfficeContactDetails extends ContactDetails {
      String officeNumber;
    }

在上述数据结构中,用户对象中的ContactDetails字段可以包含'PersonalContactDetails'或'OfficeContactDetails'类型的对象。

请求可以包含以下 JSON 字符串:

    {
      "name" : "John",
      "contactDetails" : {
                    "street" : "7",
                    "area" : "NY",
                    "mobileNumber" : "9898xxxxx"
                  }
    }

以上 JSON 字符串的解组给出了具有仅包含两个参数的 contactDetails 字段的用户对象,即街道和区域。

我希望 unmarshall 的输出具有在 ContactDetails 字段中设置的 PersonalContactDetails class 对象和有效的 mobileNumber。

请求需要显示子类的类型:

 {
      "name" : "John",
      "contactDetails" : {
                    "@type" : "PersonalContactDetails",  
                    "street" : "7",
                    "area" : "NY",
                    "mobileNumber" : "9898xxxxx"
      }
 }

要显示额外的 @type 属性 使用以下注释:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes({
    @JsonSubTypes.Type(PersonalContactDetails.class),

    @JsonSubTypes.Type(OfficeContactDetails.class) }
)
class ContactDetails {
      String street;
      String area;
}

以下是不需要在输入JSON中添加@type注解的解决方案:

     {
       "name" : "John",
       "contactDetails" : {
           "street" : "7",
           "area" : "NY",
           "mobileNumber" : "9898xxxxx"
       }
      }

以下是应用于数据 类 的注释:

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = “type”)
    @JsonSubTypes({
    @JsonSubTypes.Type(PersonalContactDetails.class, name="PersonalContactDetails"),
    @JsonSubTypes.Type(OfficeContactDetails.class, name="OfficeContactDetails") }
    )
    class ContactDetails {
        String street;
        String area;
    }

    @JsonTypeName("PersonalContactDetails")
    class PersonalContactDetails extends ContactDetails {
        String mobileNumber;
    }

    @JsonTypeName("OfficeContactDetails")
    class OfficeContactDetails extends ContactDetails {
        String officeNumber;
    }