REST API中复合对象的解组

时间:2016-09-05 11:44:12

标签: json rest jersey jackson resteasy

我有以下数据结构:

    class User {
      String name;
      ContactDetails contactDetails;
    }

    class ContactDetails {
      String street;
      String area;
    }

    class PersonalContactDetails extends ContactDetails {
      String mobileNumber;
    }

    class OfficeContactDetails extends ContactDetails {
      String officeNumber;
    }

在上述数据结构中,User Object中的ContactDetails字段可以包含类型为' PersonalContactDetails'或者' OfficeContactDetails'。

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

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

上述JSON字符串的解组为User的User提供了contactDetails字段,该字段仅包含两个参数,即街道和区域。

我希望unmarshall的输出在ContactDetails字段中设置具有有效mobileNumber的Object of PersonalContactDetails类。

2 个答案:

答案 0 :(得分:2)

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

 {
      "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;
}

答案 1 :(得分:1)

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

     {
       "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;
    }