我有 POJO,在 REST API 中用作请求和响应对象,如下所示(我知道重复的 @JsonProperty 在语法上不正确,请参见下文):
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”对象有时会是(Request 类中的 PatientObjectA):
"patient": {
"identifier": {
"type": {
"coding": {
"system": "NA",
"code": "Patient"
},
"text": "Patient"
},
"system": "Patient",
"value": "000000000"
}
}
或者这种情况(注意标识符对象基数的差异,在这种情况下标识符可以有一个或多个项目)(Request 类中的 PatientBObject):
"patient": {
"identifier": [{
"type": {
"coding": {
"system": "NA",
"code": "Patient"
},
"text": "Patient"
},
"system": "Patient",
"value": "3018572032"
}]
}
我想实现一种将请求映射到正确对象的功能。有没有一种方法(除了自定义反序列化器之外)可以按类型/基数将请求映射到适当的对象?任何见解将不胜感激!
最佳答案
Jackson 通过 @JsonTypeInfo 注释支持这一点。
我建议在属性(json 字段)中指定类型信息并使用完整的类名(而不是短名称)以提供更好的唯一性保证:
@JsonTypeInfo(include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.CLASS, property = "jsonType")
公共(public)类 PatientObjectA {
..
输出 A 如下所示:
“病人”: {
“jsonType”:“com.company.PatientAObject”
“标识符”:{
“类型”: {
“编码”:{
“系统”:“不适用”,
“代码”:“患者”
},
“文本”:“病人”
},
“系统”:“患者”,
“值”:“000000000”
}
}
输出 B 如下所示:
“病人”: {
“jsonType”:“com.company.PatientBObject”
“标识符”:{
“类型”: {
“编码”:{
“系统”:“不适用”,
“代码”:“患者”
},
“文本”:“病人”
},
“系统”:“患者”,
“值”:“000000000”
}
}
注意:另外,请查看@JsonRootName,因为它使您能够创建“有根”json 对象,而无需拥有您拥有的包装器对象。
@JsonRootName("患者")
@JsonTypeInfo(include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.CLASS, property = "jsonType")
公共(public)类 PatientObjectA {
..
..和..
@JsonRootName("患者")
@JsonTypeInfo(include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.CLASS, property = "jsonType")
公共(public)类 PatientObjectB {
..
有助于更多研究的相关术语:
- json 中的多态性
- json 相当于 xml 命名空间。
关于Java Jackson反序列化同名但不同类类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51051967/