Jackson:将“ flat” json映射到Data类子对象

时间:2018-11-09 17:28:14

标签: java json jackson

我正在处理的项目通过MQ通过以下方式实现了

example.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
  }
}

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

NotificationV1.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

使用以下映射器:

//no special config
notificationMessage = new ObjectMapper().readValue(jsonMessage, EmailNotificationMessage.class);

作为项目范围重构的一部分,上面的数据类已更改为看起来像这样:

NotificationV2.java

public class NotificationV2 {
    private EmailHeaders emailHeaders;
    private TemplateData templateData;
    //getters and setters omitted

EmailHeaders.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

TemplateData.java

public class TemplateData {
    private String templateName;
    private Map<String, String> replacementValues;
    private Map<String, String> images;
    private Object jsonObject;
    //getters and setters omitted

自然地,现有的映射会在json和新对象中围绕无法识别的属性抛出错误;无法映射templateNAme,找不到emailHeaders和templateData,依此类推。我无法更改json的结构以适合新对象,但还没有找到演示上述用例的资源进行映射。是否可以在NotificationV2上使用批注和/或可以将某种映射器配置放在一起以便将所有这些挂钩起来?

1 个答案:

答案 0 :(得分:1)

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

示例:

 public class Parent {
    public int age;
    public Name name;
  }
  public class Name {
    public String first, last;
  }

通常将按以下顺序进行序列化:

  {
    "age" : 18,
    "name" : {
      "first" : "Joey",
      "last" : "Sixpack"
    }
  }

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

 public class Parent {
    public int age;
    @JsonUnwrapped
    public Name name;
  }

这将输出以下内容:

 {
    "age" : 18,
    "first" : "Joey",
    "last" : "Sixpack"
  }

有关更多信息,请参见docs