我在以下示例中将JSON反序列化到实现 Basic 接口的一些类,例如 ChildA、ChildB 等,遇到了问题。
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = InstagramUser.class, name = "ChildA")
})
public interface Basic {
getName();
getCount();
}
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeName("ChildA")
public class ChildA implements Basic { ... }
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeName("ChildB")
public class ChildB implements Basic { ... }
...
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Response<E extends Basic> {
@JsonProperty("data")
private List<E> data;
public List<E> getData() {
return data;
}
public void setData(List<E> data) {
this.data = data;
}
}
// deserialization
HTTPClient.objectMapper.readValue(
response,
(Class<Response<ChildA>>)(Class<?>) Response.class
)
异常信息是:com.fasterxml.jackson.databind.JsonMappingException: 意外的标记(END_OBJECT),期望的是字段名:缺少属性'type',该属性应包含类型ID(用于Basic类)
期望的JSON格式如下:
{
"data": [{ ... }, ...]
}
所有的类型对象都没有共同的属性,因此它们是完全不同的。 但是,正如您在readValue行上所看到的,我知道预期的类型。 如何构造JsonTypeInfo和JsonSubTypes注释以将JSON反序列化为预期的类?