1

我有一个杰克逊多态问题。我想将 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 反序列化类 Bar”。我相信这是因为 JsonTypeInfo 和 JsonSubTypes 注释已经解析了“类型”属性并发现数组中的第二个实体应该映射到 Bar 类;但是它试图在该 2 实体中的 type 属性之后找到“某物”。换句话说,Jackson 认为它是一个空的 JSON 对象。

(注意:数组中没有第二个条目的上述数据可以正常工作。换句话说,我们可以反序列化为包含 Foo 对象的列表,因为它至少具有“类型”以外的属性)

知道如何解决这个问题吗?

4

1 回答 1

1

错误地,我使用的是 Jackson 1.5,我碰到了 Jackson 1.9,异常消失了。所以杰克逊 1.5 中存在一个错误

于 2013-04-22T18:57:55.433 回答