Java Jackson反序列化同名但不同类类型的对象

Java Jackson反序列化同名但不同类类型的对象,java,serialization,jackson,deserialization,jackson2,Java,Serialization,Jackson,Deserialization,Jackson2,我有一些POJO,它们在RESTAPI中用作请求和响应对象(我知道duplicate@JsonProperty在语法上不正确,请参见下文): 或者在这种情况下(注意标识符对象的基数不同,在这种情况下标识符可以有一个或多个项)(请求类中的PatientObject): 我想实现一个功能,将请求映射到正确的对象。是否有一种方法(自定义反序列化程序除外)可以按类型/基数将请求映射到适当的对象?如有任何见解,将不胜感激 Jackson通过@JsonTypeInfo注释支持这一点 我建议在属性(json字

我有一些POJO,它们在RESTAPI中用作请求和响应对象(我知道duplicate@JsonProperty在语法上不正确,请参见下文):

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


我想实现一个功能,将请求映射到正确的对象。是否有一种方法(自定义反序列化程序除外)可以按类型/基数将请求映射到适当的对象?如有任何见解,将不胜感激

Jackson通过@JsonTypeInfo注释支持这一点

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

@JsonTypeInfo(include=JsonTypeInfo.As.PROPERTY,use=JsonTypeInfo.Id.CLASS,PROPERTY=“jsonType”)
公共类项目{
..

输出A如下所示:

“病人”:{
“jsonType”:“com.company.patientObject”
“标识符”:{
“类型”:{
“编码”:{
“系统”:“NA”,
“代码”:“患者”
},
“文本”:“患者”
},
“系统”:“患者”,
“值”:“000000000”
}
}
输出B看起来像:

“病人”:{
“jsonType”:“com.company.patientObject”
“标识符”:{
“类型”:{
“编码”:{
“系统”:“NA”,
“代码”:“患者”
},
“文本”:“患者”
},
“系统”:“患者”,
“值”:“000000000”
}
}

注意:另外,请查看@JsonRootName,因为它将使您能够创建一个“根”json对象,而不必拥有您拥有的包装器对象

@JsonRootName(“患者”)
@JsonTypeInfo(include=JsonTypeInfo.As.PROPERTY,use=JsonTypeInfo.Id.CLASS,PROPERTY=“jsonType”)
公共类项目{
..

…和

@JsonRootName(“患者”)
@JsonTypeInfo(include=JsonTypeInfo.As.PROPERTY,use=JsonTypeInfo.Id.CLASS,PROPERTY=“jsonType”)
公共类对象B{
..

协助更多研究的相关术语:

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

Jackson通过@JsonTypeInfo注释支持这一点

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

@JsonTypeInfo(include=JsonTypeInfo.As.PROPERTY,use=JsonTypeInfo.Id.CLASS,PROPERTY=“jsonType”)
公共类项目{
..

输出A如下所示:

“病人”:{
“jsonType”:“com.company.patientObject”
“标识符”:{
“类型”:{
“编码”:{
“系统”:“NA”,
“代码”:“患者”
},
“文本”:“患者”
},
“系统”:“患者”,
“值”:“000000000”
}
}
输出B看起来像:

“病人”:{
“jsonType”:“com.company.patientObject”
“标识符”:{
“类型”:{
“编码”:{
“系统”:“NA”,
“代码”:“患者”
},
“文本”:“患者”
},
“系统”:“患者”,
“值”:“000000000”
}
}

注意:另外,请查看@JsonRootName,因为它将使您能够创建一个“根”json对象,而不必拥有您拥有的包装器对象

@JsonRootName(“患者”)
@JsonTypeInfo(include=JsonTypeInfo.As.PROPERTY,use=JsonTypeInfo.Id.CLASS,PROPERTY=“jsonType”)
公共类项目{
..

…和

@JsonRootName(“患者”)
@JsonTypeInfo(include=JsonTypeInfo.As.PROPERTY,use=JsonTypeInfo.Id.CLASS,PROPERTY=“jsonType”)
公共类对象B{
..

协助更多研究的相关术语:

  • json中的多态性
  • json等价于xml名称空间
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;
}
"patient": {
  "identifier": {
    "type": {
      "coding": {
        "system": "NA",
        "code": "Patient"
      },
      "text": "Patient"
    },
    "system": "Patient",
    "value": "000000000"
  }
}
    "patient": {
      "identifier": [{
         "type": {
          "coding": {
            "system": "NA",
            "code": "Patient"
          },
          "text": "Patient"
        },
        "system": "Patient",
        "value": "3018572032"
      }]
    }