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

Java Jackson反序列化同名但不同类类型的对象

闻人越
2023-03-14
public class Request {

    @JsonProperty("patient")
    PatientObjectA patientA;

    @JsonProperty("patient")
    PatientObjectB patientB;
}

public class PatientObjectA {
    @JsonProperty("identifier")
    Private Identifier identifier

    @JsonProperty("system")
    Private String system;

    @JsonProperty("value")
    Private String value;
}

public class PatientObjectA {
    @JsonProperty("identifier")
    Private List<Identifier> identifier

    @JsonProperty("system")
    Private String system;

    @JsonProperty("value")
    Private String value;
}
"patient": {
  "identifier": {
    "type": {
      "coding": {
        "system": "NA",
        "code": "Patient"
      },
      "text": "Patient"
    },
    "system": "Patient",
    "value": "000000000"
  }
}
    "patient": {
      "identifier": [{
         "type": {
          "coding": {
            "system": "NA",
            "code": "Patient"
          },
          "text": "Patient"
        },
        "system": "Patient",
        "value": "3018572032"
      }]
    }

我想实现一个功能,其中请求映射到正确的对象。是否有一种方法(除了自定义反序列化器)可以将请求按类型/基数映射到适当的对象?任何见解都将不胜感激!

共有1个答案

昌砚
2023-03-14

Jackson通过@JsonTypeInfo注释支持这一点。

我建议在属性(一个json字段)中指定类型信息,并使用完整的类名(而不是短名称)来提供更好的唯一性保证:

@jsonTypeInfo(include=jsonTypeInfo.as.property,use=jsonTypeInfo.id.class,property=“jsonType”)公共类PatientObjectA{..

输出A看起来像:“patient”:{“jsontype”:“com.company.patientaobject”“identifier”:{“type”:{“coding”:{“system”:“na”,“code”:“patient”},“tode”:“patient”}:{“type”:{“system”:“na”,“code”:“patient”},“value”:“000000000”}}输出B看起来像:“patient”:{“jsontype”:“/代码>

注意:另外,请查看@jsonrootname,因为它将使您能够创建一个“有根的”json对象,而不必使用包装器对象。

@jsonrootname(“patient”)@jsonTypeInfo(include=jsonTypeInfo.as.property,use=jsonTypeInfo.id.class,property=“jsonType”)公共类PatientObjectA{..

...还有...

@jsonrootname(“patient”)@jsonTypeInfo(include=jsonTypeInfo.as.property,use=jsonTypeInfo.id.class,property=“jsonType”)公共类PatientObjectB{..

协助更多研究的相关术语:

    JSON中的
  • 多态性
  • xml名称空间的JSON等效项。

 类似资料:
  • 我有一个REST API,它返回JSON响应为: 有时它会返回: 我有一个这样的POJO: 那么,有没有办法(除了编写自己的自定义反序列化程序)在 Jackson2 中帮助我将 JSON 中的通道映射到字符串类型(当它是时)和类型(当它是 JSON 对象时)? 或者换句话说,Jackson中是否有一种方法可以通过变量的映射,而不仅仅是通过?

  • 问题内容: 我有一个REST API,它返回JSON响应为: 有时它返回: 我有一个像这样的POJO: 那么,有没有一种方法(不是写你自己的其他 自定义解串器 中)Jackson2,这将有助于我映射在JSON来时,它的A型和类型时,它是一个JSON对象? 或者换句话说,在Jackson中,有没有一种方法可以按变量而不是by 映射? 问题答案: 我可以建议您像这样使用JsonNode: 或像这样 :

  • 我试图反序列化2种不同类型的列表,包括它们的派生类 为了更好地解释它,我做了下面的例子 我有2个系统: API系统 与下列实体合作: 应用系统 使用以下DTO 使用此示例,API系统返回一个

  • 序列化和反序列化的方式不同于 我已经创建了两个序列化程序 和 我用Jackson查看了序列化/反序列化映射 ,但找不到解决方案。

  • 问题内容: 我有一个Web服务的结果,该结果返回布尔值或单例映射,例如 布尔结果: 地图结果: 单独地,我可以轻松地映射这两个位置,但是我该如何做呢? 基本上我想将其映射到一个类: 所有所有多态示例都用于基于数据中的属性进行映射,但是在这种情况下,我没有该选项。 编辑 代码的更新部分: 问题答案: 不不不。您不必编写自定义解串器。只需先使用“无类型”映射: 给出“定级” 价值或“定级”价值(采用第

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