Jaskson Json使用继承序列化多态

时间:2018-11-15 04:22:45

标签: java json serialization jackson polymorphism

试图将Json序列化为对象,它们已经实现并且具有非原始数据类型。这是我要运行的代码。

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = 
 JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
        @JsonSubTypes.Type(value = Child.class, name = "Child")
})
public interface Parent {

}

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "cdata"
})
public class Child implements Serializable, Parent {

    private static final long serialVersionUID = 34658537546173718L;

    @JsonProperty("cdata")
    private Cdata cdata;
}

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "version"
})
public class Cdata implements Serializable {
    private static final long serialVersionUID = -7706669244151885541L;

    private String version;
}

ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
mapper.configure( MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true );
Parent parent = mapper.readValue("jsonString", Parent.class);

这是我运行上述代码时遇到的错误:

  

com.fasterxml.jackson.databind.exc.InvalidTypeIdException:无法将类型id'cdata'解析为[简单类型,类Child]的子类型:已知类型id = [Child]    

1 个答案:

答案 0 :(得分:0)

在@Baldy的帮助下,确定。我发现 将默认类型更改为OBJECT_AND_NON_CONCRETE解决了该问题。

mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE);