【问题标题】:Include classname as a wrapper object in json在 json 中包含类名作为包装对象
【发布时间】:2021-01-14 14:19:54
【问题描述】:

我目前正在 java 中构建一个 JSON,它将在调用 POST 端点时用作请求体。我需要构建到 JSON 中的类如下所示:

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 从此类生成 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 将“EmployeeImport”类包含为包装对象,如下所示:

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

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

我已经为此寻找了一个好的解决方案,并且我看到注释“@JsonTypeInfo”似乎可以解决这个问题,但这似乎只适用于杰克逊图书馆。

有没有人知道如何使用 GSON 库来解决这个问题?

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    您可以创建该包装类 - 并将其用作您的 EmployeeImport

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

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

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

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

    【讨论】:

    • 这是一个很好的解决方案,可以按照我的意愿工作。谢谢@andrewjames!
    猜你喜欢
    • 2012-04-20
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2013-05-22
    • 2012-09-04
    • 2012-02-17
    • 1970-01-01
    相关资源
    最近更新 更多