jbailie1991
jbailie1991

Reputation: 1345

Jackson: map "flat" json to Data class child objects

Project I'm working on has the following come through via MQ:

example.json

{
  "templateName": "testTemplate",
  "to": [
    "[email protected]"
  ],
  "cc": [
      "[email protected]
  ],
  "bcc": [
      "[email protected]
  ],
  "from": "[email protected]",
  "subject": "testSubject",
  "replacementValues": {
    "replacementValue1": "lorem",
    "replacementValue2": "ipsum"
  },
  "jsonObject": {
    //omitted for brevity
  }
}

And as is, it will map to the following object:

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

using the following mapper:

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

As part of a project wide refactor, the data class above has been altered to instead look like this:

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

Naturally, the existing mapping throws errors around unrecognised properties in the json vs. the new object; cant map templateNAme, found emailHeaders and templateData, and so on. I cant change the structure of the json in order to fit the new object but havent found a resource that demonstrates a use case like the above for mapping. Are there annotations I can use on NotificationV2 and/or some sort of mapper configuration I can put together in order to hook all of this up?

Upvotes: 4

Views: 3241

Answers (1)

Eamon Scullion
Eamon Scullion

Reputation: 1384

To flatten your nested classes, you can use the annotation @JsonUnwrapped.

Example:

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

This would normally be serialized as follows:

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

By updating the parent to use @JsonUnwrapped, we can flatten the nested objects:

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

This will output the following:

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

See docs for more information

Upvotes: 10

Related Questions