2015-11-05 110 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") 

然后可以删除自定义解串器。

相关问题