java - 如何为复杂对象创建不同的 JSON 输出
问题描述
我想根据用例为同一个复杂的 Java 对象生成不同的 Json 输出。
例如检查以下代码:
class Employee {
private Long id;
private String name;
private EmployeeDetail detail;
private Department department;
...
}
class Department {
private Long id;
private String name;
private String address;
...
}
class EmployeeDetail {
private Long id;
private int salary;
private Date birthDate;
...
}
如果我将 Employee 转换为 Json,Employee、EmployeeDetail 和 Department 中的所有字段都将出现。它适用于一个用例。
但是在第二个用例中,我想跳过除 id 字段之外的部门详细信息,但保留完整的 EmployeeDetail。
@JsonView(EmployeeView.Basic.class)
我知道我可以在类中添加类似于id
字段的内容Department
并使用 Json 视图。但是,对于更简洁的代码,我想在 Employee 类中解决它,如下所示:
class Employee {
private Long id;
private String name;
@JsonAllFields
private EmployeeDetail detail;
@JsonIdOnly
private Department department;
...
}
目前我使用 Jackson 库,但可以根据需要进行切换。
解决方案
刚刚找到了一个解决方案@JsonFilter
现在 Employee 类看起来像这样:
class Employee {
private Long id;
private String name;
private EmployeeDetail detail;
@JsonFilter("departmentFilter")
private Department department;
...
}
生成有限 json 的代码如下所示:
ObjectMapper mapper = new ObjectMapper();
SimpleFilterProvider filterProvider = new SimpleFilterProvider();
filterProvider.addFilter("departmentFilter", SimpleBeanPropertyFilter.filterOutAllExcept("id"));
mapper.setFilterProvider(filterProvider);
一个小缺点是,现在我还需要定义过滤器来生成完整、详细的 json,如下所示:
filterProvider.addFilter("departmentFilter", SimpleBeanPropertyFilter.serializeAll());
推荐阅读
- python-3.x - 如何在 Pyppeteer 中禁用图像/CSS?
- validation - .NET Core - 自定义验证属性消息
- android - Android build , Directory.exist = true 在编辑器中但不在构建中
- kotlin - 在协程处理程序和 try-catch 块中处理异常
- ruby-on-rails - 来宾用户的 Cancancan 功能
- tensorflow - DDPG 实现不收敛 tensorflow
- c# - WPF MVVM 绑定 - 列表不刷新
- c# - StreamReader 返回 ("")
- regex - 解析名称以使用正则表达式创建电子邮件
- javascript - 如何更新在父级中使用 map() 渲染的所有子级的状态?