Java 使用POJO实现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

我想用jax-rs来使用json,我的方法标记是这样的

@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
    }
}