在 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 中看到您需要的外部对象名称。
我目前正在 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:
生成一个 JSONprivate 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 中看到您需要的外部对象名称。