Джексон: сопоставить «плоский» JSON с дочерними объектами класса Data - PullRequest
0 голосов
/ 09 ноября 2018

Проект, над которым я работаю, через 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 голосов
/ 09 ноября 2018

Чтобы сгладить вложенные классы, вы можете использовать аннотацию @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"
  }

См. документы для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...