我有一個類,如:定製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似乎並不知道原始映射。一旦你知道具體的類,有沒有辦法將剩下的過程委託給原始的反序列化過程呢?