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

使用基于键的类型名称反序列化多态JSON类型

澹台星光
2023-03-14

下面是我想与Jackson反序列化的JSON示例。

{
  "person": {
    "contacts": {
      "address": {
        "type": "Office",
        "street": "1600 Amphitheatre Parkway",
        "city": "Mountain View",
        "state": "CA",
        "zip": "94043",
        "country": "United States"
      },
      "email": {
        "type": "Home",
        "emailAddress": "e.schmidt@google.com"
      },
      "phone": [
        {
          "type": "Mobile",
          "phoneNumber": "+1 888 555555"
        },
        {
          "type": "Home",
          "phoneNumber": "+1 888 1111111"
        }
      ],
      "website": {
        "type": "work",
        "webService": "URL",
        "webAddress": "www.google.com"
      }
    },
    "firstName": "Eric",
    "lastName": "Schmidt"
  }
}

这里反序列化的棘手之处是联系人节点。需要注意的事情:

  1. contacts是一种多态抽象类型(参见下面的POJOs)

目标POJO:

public class Person
{
    public String firstName;
    public String LastName;
    public List<Contact> contacts; // mixes Address, Phone, Email, Website
}

public abstract class Contact {
    public Long id;
}

public class Phone extends Contact
{
    public String type;
    public String phoneNumber;
}

// other subtypes of Contact omitted for brevity

注意:外部需求要求我使用抽象联系人类型。我宁愿直接反序列化到这些POJO,而不是让联系人类型挂起的中间POJO在另一个步骤中手动映射/转换到我的列表。

我已经查看了许多其他杰克逊多态反序列化问题,但似乎没有一个能处理这种情况(特别是#2和#3)。

我想将联系人对象反序列化为列表

要实现这一点,需要如何正确应用JsonTypeInfo和JsonSubTypes?

(如果有人感兴趣,这是CapsuleCRM的JSON格式)


共有1个答案

赵禄
2023-03-14

您需要编写一个自定义反序列化器并将其注册到Jackson。实现将检查初始启动,然后相应地解析。想想sax样式处理。

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

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

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

  • 我认为最好用一个例子来解释。 我有一个想要反序列化的JSON对象,它包含一个接口类型列表以及列表中的类型,但是我不确定如何让反序列化器确定列表中的具体类型: 要反序列化的类型 界面 儿童 我知道如果类型不是<code>List</code>,我可以将类型与<code>JsonSubTypes</code>一起使用,例如: 如果在父类型内,也是如此。但是当类型在类之外时,是否有一种方法可以帮助反序列

  • 我之前的问题没有得到任何结果,可能是我问得不对,或者太详细了。 现在我的基本问题是,如何将一个具有一个类名的JSON对象反序列化为一个具有不同类名的Java对象? 例如,服务器发送/期望的JSON类是“18”(我对此控制为零)。我的Java班不可能是“18”,所以是“_18”。 简单地执行new Gson().fromjson()没有任何帮助,即使使用了不同的命名策略;_18对象始终为NULL。从

  • 我正在尝试使用Jakson反序列化一个嵌套的多态类型。也就是说,我的顶级类型引用了另一个多态类型,该类型最终由不抽象的类扩展。这不起作用,它会抛出一个异常。 下面是我尝试做的一个简化的例子。 我得到了关于抽象类型的标准异常。 让我解释一下我的用例。我有一个描述数据工作流的Json文档。我在“Level One”有一个抽象类型,描述对单个值的操作。我派生了一堆不是抽象的类,它们实现了公共操作(我用@