【发布时间】:2018-01-03 14:43:02
【问题描述】:
我无法将 JSON 反序列化为以下示例中实现 Basic 接口的某些类 ChildA、ChildB 等。 p>
@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),预期 FIELD_NAME:缺少包含类型 ID 的属性“类型”(对于 Basic 类)
预期的 JSON 是这样的:
{
"data": [{ ... }, ...]
}
所有类型对象中都没有属性,因此它们完全不同。但正如您在 readValue 行上看到的那样,我知道预期的类型。如何构造 JsonTypeInfo 和 JsonSubTypes 注释以将 JSON 反序列化为预期的类?
【问题讨论】:
-
是json中要反序列化的类型吗?
-
“数据”中的对象是预期格式(ChildA),但没有包含信息的属性是什么类型。列表中的所有对象都是相同的。不幸的是,我无法更改 JSON。
-
这就是问题所在 - 您的注释告诉杰克逊期望 json 中有一个类型,但没有一个
标签: java json jackson polymorphism deserialization