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对象,因为它至少具有比“类型”以外的属性的列表。)

任何想法如何解决这个问题?

+0

一个评论:你在@Type(value = Bar.class,name =“bar”)中有一个拼写错误。我认为它应该是“酒吧”,而不是? – StaxMan 2013-04-22 17:58:03

+0

哪个杰克逊版本?听起来像一个bug - 在Jackson 1.x的开发过程中,这样的事情已经修复。 – StaxMan 2013-04-22 17:58:43

+0

@StaxMan 这确实是一个错字。修复。但是这并没有改变这个问题。 – user2305793 2013-04-22 18:18:06

错误地,我正在使用杰克逊1.5 我撞到杰克逊1.9,例外消失。所以有一个错误在杰克逊1.5

+0

有道理 - 听起来很熟悉。 :) – StaxMan 2013-04-22 19:13:25