2015-11-05 106 views
2

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

回答

1

這似乎是我只需要anotate我JsonMotivation類

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class") 

然後可以刪除自定義解串器。

相關問題