我有一个类,如:定制JsonDeserializer反序列化抽象类的亚型RestEasy的
public abstract class JsonMotivation {
protected int motivationid;
... getters and setters
public abstract String getMotivationType();
public void setMotivationType(String motivationType) {
}
}
这motivationType数据字段将保持基准
然后,我有一些实现类,如:
@XmlRootElement
public class JsonAntibioticMotivation extends JsonMotivation {
protected long smhid;
protected int userid;
@Override
public String getMotivationType() {
return "AB";
}
... getters and setters
}
最后,我还有一些扩展JsonAntibioticMotivation类的类,例如
@XmlRootElement
public class JsonSwitchAntibioticMotivation extends JsonAntibioticMotivation {
@Override
public String getMotivationType() {
return "AB-S";
}
... some additional dataparameters
}
其中一个名为JsonMedicationhistory的类引用了抽象类JsonMotivation。在反序列化过程中,我得到一个错误:“无法构建be.uzgent.cosara.model.json.JsonMotivation的实例,问题:抽象类型或者需要映射到具体类型,具有自定义反序列化器,或者使用附加类型信息实例化”
杰克逊似乎并不知道哪个具体的类用于反序列化。我能以某种方式将motivationType映射到一个具体的类吗?我试着写一个自定义解串器并注明JsonMotivation与@JsonDeserialize(using=JsonMotivationDeserializer.class)
public class JsonMotivationDeserializer extends JsonDeserializer<JsonMotivation> {
@Override
public JsonMotivation deserialize(JsonParser jp,
DeserializationContext ctxt) throws IOException,
JsonProcessingException {
ObjectMapper mapper= new ObjectMapper();
JsonNode node=jp.getCodec().readTree(jp);
JsonNode motivationTypeNode=node.get("motivationType");
if(motivationTypeNode!=null){
String motivationType=motivationTypeNode.textValue();
switch(motivationType){
case "AB": return mapper.readValue(jp, JsonAntibioticMotivation.class);
case "AB-N": return mapper.readValue(jp, JsonNewAntibioticMotivation.class);
case "AB-S": return mapper.readValue(jp, JsonSwitchAntibioticMotivation.class);
case "AB-E": return mapper.readValue(jp, JsonExtendAntibioticMotivation.class);
}
}
return null;
}
}
然而,这似乎并没有解决问题。 ObjectMapper似乎并不知道原始映射。一旦你知道具体的类,有没有办法将剩下的过程委托给原始的反序列化过程呢?