我正在使用Jackson来解析我无法控制的JSON。JSON如下所示:
{
"status":"0"
"type":"type1"
"info": {
// additional fields
}
}我的类看起来像这样
public class Response {
private String status;
private String type;
private Info info
}我使用的Info的子类取决于type属性,所以我对info的映射是
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonSubTypes(value = {
@JsonSubTypes.Type(value = Type1Info.class, name = "type1"),
@JsonSubTypes.Type(value = Type2Info.class, name = "type2") })
public abstract class Info {
// some fields
}据我所知,当区分元素与必须强制转换的元素处于同一级别时,这是使用类型信息的正确方法。但这不起作用,我总是得到相同的错误:
类型意外标记(END_OBJECT),应为FIELD_NAME:缺少要包含类型id的属性“”type“”
如果我将EXTERNAL_PROPERTY更改为PROPERTY,我仍然会得到相同的错误。我对EXTERNAL_PROPERTY的理解是错误的吗?
发布于 2014-01-04 07:28:29
来自Javadoc:
类似于属性的
包含机制,不同之处在于属性包含在层次结构的更高一层,即与JSON Object to type处于同一级别的同级属性。请注意,此选项只能用于属性,而不能用于类型(类)。尝试将其用于类将导致基本属性的包含策略。
注意到can only be used for properties是粗体的。来源:JsonTypeInfo.As.EXTERNAL_PROPERTY。
因此,您必须将所有注释从Info类移动到属性info或Response类中的setInfo方法。
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type")
@JsonSubTypes(value = { @JsonSubTypes.Type(value = Type1Info.class, name = "type1"),
@JsonSubTypes.Type(value = Type2Info.class, name = "type2") })
public void setInfo(Info info) {
this.info = info;
}对我来说,您还应该从Response类中删除type属性。它将在序列化过程中动态生成。在反序列化中,你不需要它,因为Jackson关心类型。您的类可能如下所示:
class Response {
private String status;
private Info info;
//getters, setters
}另请参阅此问题:JSON nest class data binding。
https://stackoverflow.com/questions/18757431
复制相似问题