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

如何基于父类中的属性对Jackson进行多态JSON反序列化?

丁淇
2023-03-14

我们有以下Json:

{
    "type" : "1",
    "otherStuff" : "2",
    ...
    "items" : [
        {
          "commonItemAttribute" : "value",
          "specificToType1" : "whatever"
          ...
        }
    ]
}

我们需要根据type属性将这些项以多态方式反序列化为不同的子类。

在自定义Jackson反序列化程序中是否可以获取类型值?

我们可以使用提供给反序列化方法的JsonParser安全地回溯Json树吗?

我发现了这篇关于多态反序列化的博客,但它似乎需要在项目本身上设置一个type属性。

谢谢

共有1个答案

唐恺
2023-03-14

不支持这种JSON,因为当“外部”类型id的形式时:

{“孩子类型”:“某个类型”,“孩子”:{......}}

它们仅适用于简单类型,不适用于集合或映射。

因此,如果无法将JSON更改为更标准的格式(包括元素的类型id是标准方式),则需要使用自定义序列化程序、反序列化程序。

 类似资料:
  • 如果我有一个像这样的类结构: 我宁愿不必强制API的客户端包含来反序列化子类。 不使用,Jackson是否提供了一种方法来注释子类并通过唯一的属性将其与其他子类区分开来?在上面的示例中,这将类似于“如果一个JSON对象具有反序列化它为,如果它具有反序列化它为”。

  • 问题内容: 我有一些类A,B,C,它们都继承自BaseClass类。 我有一个String json,其中包含A,B,C或BaseClass的json表示形式。 我想要某种方法将此字符串反序列化为BaseClass(多态反序列化)。像这样 可以是A,B,C或BaseClass中任何一个的Json String表示形式。 问题答案: 目前尚不清楚原始海报有什么问题。我猜这是两件事之一: 未绑定JSO

  • 我正在使用JacksonPolymorphicDeserialization,这是我的代码,它反序列化到基于“type”属性的适当类中: 它工作得很好,我的json根据“type”值变成了预期的类。 但是,我正在考虑将“type”属性从String移动到Enum,这是我的新代码,带有以下更改: 和枚举: 问题是,第二种方法不起作用。。。知道为什么吗???我可以在这里使用Enum吗??? 谢谢!

  • 我有一个杰克逊多态性问题。我想将JSON数据反序列化为多态类型。通过阅读Jackson文档,我可以将JSON数据反序列化为多态类型。不过,我有一个特例。我有一个类结构如下: 注意:类栏除了继承的“类型”字段之外没有任何其他成员变量。 如果我传入上面的json数据,如: 我得到了类似“无法从end_token中反序列化类条”的信息。我相信这是因为JsonTypeInfo和JsonSubTypes注释

  • 我需要反序列化以下json: 将它的< code>id属性设置为< code>foo_id json属性。 我需要在自定义反序列化程序中执行此操作。实现这一点最简单的方法是什么? 我想以某种方式将json“转换”为 然后将此委托给杰克逊。 在本例中,对象的类型为Foo,但其他对象可能不属于此类。另外,在本例中,json是一个数字,但如果它也是一个字符串,我希望支持。所以,我需要一种通用的方法来做到

  • 鉴于这种反应: 我怎样才能将数据属性反序列化为像这样的 MapDTO 我已经尝试使用自定义反序列化器,但是按名称获取所有属性,然后基于这些属性和嵌套对象创建一个新的MapDTO对象看起来很麻烦。如果结构发生变化,我必须更改反序列化器和DTO本身。让Jackson从给定的根开始进行反序列化会更容易。我使用Jackson 2.12.4到ResAs的4.4.0。我想避免创建不必要的包装类。