我有像这样的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"
}
}
我想实现一种将请求映射到正确对象的功能。有没有一种方法(自定义解串器除外)可以按类型/基数将请求映射到适当的对象?任何见识将不胜感激!
答案 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 {
..
有助于进一步研究的相关术语: