Java 使用POJO实现JSON的多态反序列化
我想用jax-rs来使用json,我的方法标记是这样的Java 使用POJO实现JSON的多态反序列化,java,json,spring,spring-mvc,jackson,Java,Json,Spring,Spring Mvc,Jackson,我想用jax-rs来使用json,我的方法标记是这样的 @PostMapping("/test") public ResponseEntity<String> consumeJson(@RequestBody TestPojo testPojo) 儿童班 public class DrugPojo extends ActivityPojo implements Serializable{ private String drugDisplay; // Getters
@PostMapping("/test")
public ResponseEntity<String> consumeJson(@RequestBody TestPojo testPojo)
儿童班
public class DrugPojo extends ActivityPojo implements Serializable{
private String drugDisplay;
// Getters & Setters
}
public class ObservationPojo extends ActivityPojo implements Serializable{
private String measurementWeight;
// Getters & Setters
}
在我的webservice方法中,我想做类似的事情
{
"code": "<code>",
"display": "<display>",
"activities": [
{
"categoryCode": "drug",
"drugDisplay" : "Ceforanide"
},{
"categoryCode": "observation",
"measurementWeight" : "80kg",
}
]
}
List<ActivityPojo> activities = testPojo.getActivities();
for(int i = 0; i < activities.size(); i++){
if( activities.get(i) instanceof DrugPojo){
// do stuff
}
else if( activities.get(i) instanceof ObservationPojo){
// do stuff
}
}
List activities=testPojo.getActivities();
对于(int i=0;i
因此,我们可以通过多态序列化我的json来实现这一点。任何帮助都将不胜感激。这个问题非常复杂,所以我做了一些测试 如果我正确理解了这个问题,我认为这个类(以及内部类)可以解决它:
@组件
@抑制警告(“串行”)
公共类ActivityPojoJsonModule扩展了SimpleModule{
公共活动类型JojSonModule(){
this.addDeserializer(ActivityPojo.class,新的ActivityPojoDeserializer());
}
公共静态类ActivityProjoDeserializer扩展了JsonDeserializer{
@凌驾
public ActivityPojo反序列化(JsonParser解析器,反序列化上下文)抛出IOException,JsonProcessingException{
ObjectCodec codec=parser.getCodec();
JsonNode=codec.readTree(解析器);
if(此.isDrug(节点)){
返回codec.treeToValue(node,DrugPojo.class);
}
返回codec.treeToValue(node,ObservationPojo.class);
}
专用布尔isDrug(JsonNode节点){
return node.get(“categoryCode”).asText()等于(“药物”);
}
}
}
它向Spring上下文添加一个组件,该组件将使用基于字段categoryCode
值的逻辑来反序列化ActivityPojo
。您只需将该类添加到扫描包中,它将覆盖Jackson的默认行为
public class DrugPojo extends ActivityPojo implements Serializable{
private String drugDisplay;
// Getters & Setters
}
public class ObservationPojo extends ActivityPojo implements Serializable{
private String measurementWeight;
// Getters & Setters
}
List<ActivityPojo> activities = testPojo.getActivities();
for(int i = 0; i < activities.size(); i++){
if( activities.get(i) instanceof DrugPojo){
// do stuff
}
else if( activities.get(i) instanceof ObservationPojo){
// do stuff
}
}