Java Jackson对具有相同名称但不同类类型的对象进行反序列化

时间:2018-06-26 22:06:07

标签: java serialization jackson deserialization jackson2

我有像这样的REST API中用作请求和响应对象的POJO(我知道重复的@JsonProperty在语法上不正确,请参见下文):

.001

基数上的细微差别在于我希望能够使用,即“ Patient”对象有时是(Request类中的PatientObjectA):

public class Request {

    @JsonProperty("patient")
    PatientObjectA patientA;

    @JsonProperty("patient")
    PatientObjectB patientB;
}

public class PatientObjectA {
    @JsonProperty("identifier")
    Private Identifier identifier

    @JsonProperty("system")
    Private String system;

    @JsonProperty("value")
    Private String value;
}

public class PatientObjectA {
    @JsonProperty("identifier")
    Private List<Identifier> identifier

    @JsonProperty("system")
    Private String system;

    @JsonProperty("value")
    Private String value;
}

或在这种情况下(请注意,标识符对象的基数不同,在这种情况下,标识符可以具有一个或多个项目)(Request类中的PatientBObject):

"patient": {
  "identifier": {
    "type": {
      "coding": {
        "system": "NA",
        "code": "Patient"
      },
      "text": "Patient"
    },
    "system": "Patient",
    "value": "000000000"
  }
}

我想实现一种将请求映射到正确对象的功能。有没有一种方法(自定义解串器除外)可以按类型/基数将请求映射到适当的对象?任何见识将不胜感激!

1 个答案:

答案 0 :(得分:1)

Jackson通过@JsonTypeInfo注释支持此操作。

我建议在属性(json字段)中指定类型信息,并使用完整的类名(而不是简称)来提供更好的唯一性保证:

@JsonTypeInfo(include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.CLASS, property = "jsonType") public class PatientObjectA { ..

输出A看起来像: "patient": { "jsonType": "com.company.PatientAObject" "identifier": { "type": { "coding": { "system": "NA", "code": "Patient" }, "text": "Patient" }, "system": "Patient", "value": "000000000" } } 输出B看起来像: "patient": { "jsonType": "com.company.PatientBObject" "identifier": { "type": { "coding": { "system": "NA", "code": "Patient" }, "text": "Patient" }, "system": "Patient", "value": "000000000" } }

注意:另外,请签出@JsonRootName,因为它将使您能够创建“ rooted” json对象,而不必拥有该包装对象。

@JsonRootName("Patient") @JsonTypeInfo(include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.CLASS, property = "jsonType") public class PatientObjectA { ..

..和..

@JsonRootName("Patient") @JsonTypeInfo(include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.CLASS, property = "jsonType") public class PatientObjectB { ..

有助于进一步研究的相关术语:

  • json中的多态性
  • 等同于xml名称空间的
  • json。