当前位置: 首页 > 知识库问答 >
问题:

Jackson多态反序列化空JSON对象

慕容宇
2023-03-14

我有一个杰克逊多态性问题。我想将JSON数据反序列化为多态类型。通过阅读Jackson文档,我可以将JSON数据反序列化为多态类型。不过,我有一个特例。我有一个类结构如下:

class Supreme {
    private String type;
}
class Foo extends Supreme {
   public String label;
}
class Bar extends Supreme {
}

注意:类栏除了继承的“类型”字段之外没有任何其他成员变量。

@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 >());

我得到了类似“无法从end_token中反序列化类条”的信息。我相信这是因为JsonTypeInfo和JsonSubTypes注释已经解析了“Type”属性,并发现数组中的第二个实体应该映射到Bar类;然而,它试图在这2个实体中的type属性之后找到“something”。也就是说,Jackson认为它是一个空的JSON对象。

(注意:上面没有数组中第2个条目的数据工作得很好。换句话说,我们可以反序列化为包含Foo对象的列表,因为它至少有一个“type”以外的属性)

知道怎么绕过这件事吗?

共有1个答案

督阿苏
2023-03-14

错误地,我使用的是Jackson1.5,我跳到了Jackson1.9,例外情况就消失了。所以Jackson 1.5中存在一个bug

 类似资料:
  • 我对Jackson和类型层次结构有以下问题。我正在序列化一个类SubA,该类将扩展为一个字符串,然后尝试将其反序列化回来。当然,在编译时,系统不知道它是基还是SubA,因此我希望它是基,如果它是SubA,则会在编译后执行一些其他操作。 我的基本类看起来像: ...和一个派生自的类: ... 我试图执行以下代码: String是: 但我一次又一次地犯同样的错误。映射器现在知道如何处理另一个类参数-它

  • 我想为我们的REST API实现一个自定义的反序列化器,它不仅被Java应用程序使用。因此,我不想让Jackson将类型信息放入序列化的JSON中。 我目前正在努力反序列化<code>CollectionExpand</code>,因为它包含特定<code>ResourceModel</code>的<code>数据</code>列表。 < code>ResourceModel是一个接口,每个< c

  • 我目前正在开发一个Java web应用程序,它使用Magento REST API公开的JSON数据。api返回的数据示例如下: 我的应用程序中有一个Java类,如下所示: 我想对数据进行反序列化,并将其转换为,但我总是得到以下错误: 这是我用来将JSON响应反序列化为ArrayList的语句行: 有人能分享一些见解吗?我看到一些例子,返回的JSON对象前面没有任何ID。那是因为我做错了什么吗?非

  • 问题内容: 如果我有这样的类结构: 还有另一种反序列化的方法吗?在父类上使用此注释: 我不想强迫我的API的客户包括反序列化一个子类。 杰克逊不是使用,而是提供了一种方法来注释子类并通过唯一属性将其与其他子类区分开来?在上面的示例中,这类似于“如果JSON对象将其反序列化为,如果它将其反序列化为”。 问题答案: 感觉像是应该使用的东西,但是我在文档中进行了选择,可以提供的任何属性似乎都不符合您所描

  • 我有以下几个类,我想使用Jackson反序列化JSON字符串。 PushNotificationMessage.java 设备信息。Java语言 IOSDeviceInfo。Java语言 WebDeviceInfo.java 我有以下要反序列化的JSON内容: 我只需使用ObjectMapper来尝试执行反序列化。 当我这样做时,我得到: com.fasterxml.jackson.databin

  • 我看过jackson反序列化@JsonTypeInfo的一个例子,那就是: 我试过了,效果很好。现在的问题是,在示例类中,Cat和Dog是从Animal中引用的,我想避免这种情况。有没有一种方法可以将类型绑定从类动物中移除,并且仍然进行反序列化工作?谢谢