Include classname as a wrapper object in json

Viewed 193

I am currently building a JSON in java that will be used as a requestbody when calling a POST-endpoint. The class I need to build into a JSON looks like this:

public class EmployeeImport {
    @SerializedName("Header")
    private final Header header;
    @SerializedName("Employees")
    private final List<Employee> employees;

    public EmployeeImport(final Header header,
                          final List<Employee> employees) {
        this.header = header;
        this.employees = employees;
    }

I use GSON to produce a JSON from this class:

private String generateJSONForImport(final Employee employee, final Header header) {
        final EmployeeImport employeeImport = new EmployeeImport(header, Arrays.asList(employee));

        final Gson gson = new Gson();
        final String json = gson.toJson(employeeImport);
        System.out.println(json);
    }

When printing the JSON, it looks like this:

{
  "Header": {
    "Date": "2021-01-14"
  },
  "Employees": [
    {
      "ValueOne": "lala",
      "ValueTwo": "lalala"
    }
  ]
}

But I need the JSON to include the class "EmployeeImport" as a wrapping object, like this:

{
    "EmployeeImport": {
        "Header": {
            "Date": "2021-01-13"
        },

        "Employees": [{
            "ValueOne": "lala",
            "ValueTwo": "lalala"
        }]
    }
}

I've searched for a good solution for this, and I have seen that the annotation "@JsonTypeInfo" seems to fix this, but this seems to only work for the jackson-library.

Does anyone know a good solution for how this could be done with the GSON-library?

1 Answers

You can create that wrapper class - and use that as your EmployeeImport.

In the below example I converted your existing EmployeeImport class into an inner class called EmployeeImportInner - and placed it inside EmployeeImport:

public class EmployeeImport {
    
    @SerializedName("EmployeeImport")
    private EmployeeImportInner inner;
    
    public class EmployeeImportInner {

        @SerializedName("Header")
        private Header header;
        @SerializedName("Employees")
        private List<Employee> employees;

        public EmployeeImportInner(final Header header,
                final List<Employee> employees) {
            this.header = header;
            this.employees = employees;
        }

        // getters/setters not shown

    }

    // getter/setter not shown

}

You don't have to do it this way - you can have 2 separate classes, if you prefer.

In my case, I build the outer object like this:

EmployeeImport employeeImport = new EmployeeImport();
        
final EmployeeImport.EmployeeImportInner employeeImportInner = 
        employeeImport.new EmployeeImportInner(header, employees);
        
employeeImport.setInner(employeeImportInner);

Now you will see that outer object name you require in your JSON.

Related