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

标签 java serialization jackson deserialization jackson2

我有 POJO,在 REST API 中用作请求和响应对象,如下所示(我知道重复的 @JsonProperty 在语法上不正确,请参见下文):

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”对象有时会是(Request 类中的 PatientObjectA):

"patient": {
  "identifier": {
    "type": {
      "coding": {
        "system": "NA",
        "code": "Patient"
      },
      "text": "Patient"
    },
    "system": "Patient",
    "value": "000000000"
  }
}

或者这种情况(注意标识符对象基数的差异,在这种情况下标识符可以有一个或多个项目)(Request 类中的 PatientBObject):

    "patient": {
      "identifier": [{
         "type": {
          "coding": {
            "system": "NA",
            "code": "Patient"
          },
          "text": "Patient"
        },
        "system": "Patient",
        "value": "3018572032"
      }]
    }

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

最佳答案

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

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

@JsonTypeInfo(include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.CLASS, property = "jsonType") 公共(public)类 PatientObjectA { ..

输出 A 如下所示: “病人”: { “jsonType”:“com.company.PatientAObject” “标识符”:{ “类型”: { “编码”:{ “系统”:“不适用”, “代码”:“患者” }, “文本”:“病人” }, “系统”:“患者”, “值”:“000000000” } } 输出 B 如下所示: “病人”: { “jsonType”:“com.company.PatientBObject” “标识符”:{ “类型”: { “编码”:{ “系统”:“不适用”, “代码”:“患者” }, “文本”:“病人” }, “系统”:“患者”, “值”:“000000000” } }

注意:另外,请查看@JsonRootName,因为它使您能够创建“有根”json 对象,而无需拥有您​​拥有的包装器对象。

@JsonRootName("患者") @JsonTypeInfo(include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.CLASS, property = "jsonType") 公共(public)类 PatientObjectA { ..

..和..

@JsonRootName("患者") @JsonTypeInfo(include = JsonTypeInfo.As.PROPERTY, use = JsonTypeInfo.Id.CLASS, property = "jsonType") 公共(public)类 PatientObjectB { ..

有助于更多研究的相关术语:

  • json 中的多态性
  • json 相当于 xml 命名空间。

关于Java Jackson反序列化同名但不同类类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51051967/

相关文章:

wcf - 从 n 层客户端遍历对象图

serialization - 使 clos 对象可在 lisp 中打印

java - 当类包含接口(interface)类型的变量时,如何通过 jackson 序列化/反序列化?

java - 奇怪的 hibernate createSQLQuery 返回 CHAR|Character 但 String

java - 将数字数组转换为 CSV 字符串的最佳方法?

java - 在 NetSuite Suitescript 中加密并在 java 应用程序中解密

Java 14记录json序列化

java - 在运行的线程中更改弹跳球的颜色

java - 保存/恢复 Android 应用程序实例状态的稳健且简单的方法

java - 为什么这段代码在包装在通用函数中时不起作用?