在 json 中包含类名作为包装器对象

Include classname as a wrapper object in json

我目前正在 java 中构建一个 JSON,它将在调用 POST 端点时用作请求体。我需要构建成 JSON 的 class 看起来像这样:

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;
    }

我使用 GSON 从这个 class:

生成一个 JSON
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);
    }

打印 JSON 时,它看起来像这样:

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

但我需要 JSON 来包含 class“EmployeeImport”作为包装对象,如下所示:

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

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

我为此寻找了一个很好的解决方案,我看到注释“@JsonTypeInfo”似乎解决了这个问题,但这似乎只适用于 jackson-library。

有人知道如何使用 GSON 库完成此操作的好的解决方案吗?

您可以创建包装器 class - 并将其用作您的 EmployeeImport

在下面的示例中,我将您现有的 EmployeeImport class 转换为名为 EmployeeImportInner 的内部 class - 并将其放置在 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

}

您不必这样做 - 如果您愿意,可以有 2 个单独的 classes。

在我的例子中,我构建了这样的外部对象:

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

现在您将在 JSON 中看到您需要的外部对象名称。