Jackson多态反序列化空的JSON对象
问题描述:
我有一个杰克逊多态问题。 我想将JSON数据反序列化为多态类型。阅读杰克逊文档,我可以将JSON数据反序列化为多态类型。不过,我有一个特例。我有一个类结构,如下所示:Jackson多态反序列化空的JSON对象
class Supreme {
private String type;
}
class Foo extends Supreme {
public String label;
}
class Bar extends Supreme {
}
注:类BAR没有任何其他成员变量不是继承的“类型”字段等。
我已经改变了该结构:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.PROPERTY,property ="type")
@JsonSubTypes({@Type(value = Foo.class, name = "Foo"),@Type(value = Bar.class, name = "Bar") })
class Supreme {
}
class Foo extends Supreme {
public String label;
}
class Bar extends Supreme {
}
String data=
"[{
"type": "Foo",
"label": "abc"
},
{
"type": "Bar"
}]"
如果我通过类似上面的JSON数据: new ObjectMapper().readValue(data, new TypeReference<List<Supreme>>());
我得到的东西,如“无法反序列化类酒吧走出END_TOKEN的”。我相信这是因为JsonTypeInfo和JsonSubTypes注解已经解析了“type”属性并且发现数组中的第二个实体应该映射到Bar类;但它试图在该实体的类型属性后面找到“某些东西”。换句话说,杰克逊认为它是一个空的JSON对象。
(注:无阵列中的第二项中的上述数据能正常工作换句话说,我们可以反序列化到含有Foo对象,因为它至少具有比“类型”以外的属性的列表。)
任何想法如何解决这个问题?
一个评论:你在@Type(value = Bar.class,name =“bar”)中有一个拼写错误。我认为它应该是“酒吧”,而不是? – StaxMan 2013-04-22 17:58:03
哪个杰克逊版本?听起来像一个bug - 在Jackson 1.x的开发过程中,这样的事情已经修复。 – StaxMan 2013-04-22 17:58:43
@StaxMan 这确实是一个错字。修复。但是这并没有改变这个问题。 – user2305793 2013-04-22 18:18:06