使用 POJOS 的多态反序列化 JSON



我想用jax-rs使用一个json,我的方法戳看起来像那样。

@PostMapping("/test")
public ResponseEntity<String> consumeJson(@RequestBody TestPojo testPojo)

我的 json 看起来像那样

{
"code": "<code>",
"display": "<display>",
"activities": [
{
"categoryCode": "drug",                
"drugDisplay" : "Ceforanide"
},{
"categoryCode": "observation",       
"measurementWeight" : "80kg",                     
}
]
}

我有以下pojos

public class TestPojo implements Serializable{
private String code;
private String display;
private List<ActivityPojo> activities;
// Getters & Setters
}

现在我有一个超级类,几个类从它继承

public class ActivityPojo implements Serializable{
private String categoryCode;
}

子类

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

所以可以多态地序列化我的 json 来做到这一点。任何帮助将不胜感激。

这个问题非常令人不安,所以我做了一些测试。

如果我正确理解了这个问题,我认为这个类(和内部的(可以解决它:

@Component
@SuppressWarnings("serial")
public class ActivityPojoJsonModule extends SimpleModule {
public ActivityPojoJsonModule() {
this.addDeserializer(ActivityPojo.class, new ActivityPojoDeserializer());
}
public static class ActivityPojoDeserializer extends JsonDeserializer<ActivityPojo> {
@Override
public ActivityPojo deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
ObjectCodec codec = parser.getCodec();
JsonNode node = codec.readTree(parser);
if(this.isDrug(node)) {
return codec.treeToValue(node, DrugPojo.class);
}
return codec.treeToValue(node, ObservationPojo.class);
}
private boolean isDrug(JsonNode node) {
return node.get("categoryCode").asText().equals("drug");
}
}
}

它将一个组件添加到 Spring 上下文中,该组件将使用基于字段值的逻辑反序列化ActivityPojocategoryCode。您只需要在扫描的包中添加此类,它将覆盖 Jackson 的默认行为。

最新更新