java - 自定义JsonDeserializer在resteasy中反序列化抽象类的子类型

标签 java json jackson wildfly

我有一个类:

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 的实例,问题:抽象类型需要映射到具体类型,具有自定义反序列化器,或者使用其他类型信息进行实例化”

Jackson 不知道使用哪个具体类进行反序列化似乎合乎逻辑。我能否以某种方式将 motivationType 映射到具体类?我尝试编写自定义反序列化器并使用 @JsonDeserialize(using=JsonMotivationDeserializer.class)

注释 JsonMotivation
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 似乎不知道原始映射。知 Prop 体类后,是否有办法将其余过程委托(delegate)给原始反序列化过程?

最佳答案

似乎我只需要用

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
注释我的 Json Motivation 类

然后可以删除自定义反序列化器。

关于java - 自定义JsonDeserializer在resteasy中反序列化抽象类的子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33545482/

相关文章:

java - Dockers 上的多模块 Maven 项目

java - 如何在java中将BufferedImage转换为gif

java - 使用类型化类和 rdf 创建 RDF 模型 :id

php - 如何使用 PHP 解析 JSON 文件?

javascript - 使用 json 将 infoWindow 添加到 map 标记

java - 如何使用json对象名作为增量值?

java - 如何四舍五入经度和纬度值

Java Mongodb 更新数据库对象

jackson - 如何让 Resteasy 2.3.6 使用 Jackson 2.+

java - 如何使用Hibernate4Module