Jackson:将“平面”json 映射到数据类子对象

jba*_*991 3 java json jackson

我正在从事的项目通过 MQ 实现以下内容:

示例.json

{
  "templateName": "testTemplate",
  "to": [
    "support@test.com"
  ],
  "cc": [
      "testCc@test.com
  ],
  "bcc": [
      "testBcc@test.com
  ],
  "from": "testFrom@test.com",
  "subject": "testSubject",
  "replacementValues": {
    "replacementValue1": "lorem",
    "replacementValue2": "ipsum"
  },
  "jsonObject": {
    //omitted for brevity
  }
}
Run Code Online (Sandbox Code Playgroud)

按原样,它将映射到以下对象:

通知V1.java

public class NotificationV1 {
    private String templateName;
    private List<String> to;
    private List<String> cc;
    private List<String> bcc;
    private String from;
    private String subject;
    private Map<String, String> replacementValues;
    private Map<String, String> images;
    private Object jsonObject;
    //getters & setters omitted for brevity
Run Code Online (Sandbox Code Playgroud)

使用以下映射器:

//no special config
notificationMessage = new ObjectMapper().readValue(jsonMessage, EmailNotificationMessage.class);
Run Code Online (Sandbox Code Playgroud)

作为项目范围重构的一部分,上面的数据类已更改为如下所示:

通知V2.java

public class NotificationV2 {
    private EmailHeaders emailHeaders;
    private TemplateData templateData;
    //getters and setters omitted
Run Code Online (Sandbox Code Playgroud)

电子邮件标题.java

public class EmailHeaders {
    private String from;
    private List<String> toAddresses;
    private List<String> ccAddresses;
    private List<String> bccAddresses;
    private String subject;
    //getters and setters omitted
Run Code Online (Sandbox Code Playgroud)

模板数据.java

public class TemplateData {
    private String templateName;
    private Map<String, String> replacementValues;
    private Map<String, String> images;
    private Object jsonObject;
    //getters and setters omitted
Run Code Online (Sandbox Code Playgroud)

当然,现有的映射会围绕 json 中无法识别的属性与新对象抛出错误;无法映射 templateNAME,找到 emailHeaders 和 templateData,等等。我无法更改 json 的结构以适应新对象,但尚未找到演示上述映射用例的资源。我是否可以在NotificationV2上使用注释和/或可以将某种映射器配置放在一起以将所有这些连接起来?

Eam*_*ion 9

要展平嵌套类,您可以使用注释@JsonUnwrapped

例子:

 public class Parent {
    public int age;
    public Name name;
  }
  public class Name {
    public String first, last;
  }
Run Code Online (Sandbox Code Playgroud)

通常会按如下方式序列化:

  {
    "age" : 18,
    "name" : {
      "first" : "Joey",
      "last" : "Sixpack"
    }
  }
Run Code Online (Sandbox Code Playgroud)

通过更新父级以使用@JsonUnwrapped,我们可以展平嵌套对象:

 public class Parent {
    public int age;
    @JsonUnwrapped
    public Name name;
  }
Run Code Online (Sandbox Code Playgroud)

这将输出以下内容:

 {
    "age" : 18,
    "first" : "Joey",
    "last" : "Sixpack"
  }
Run Code Online (Sandbox Code Playgroud)

请参阅文档以获取更多信息