java - 从 json 响应中排除空对象、空数组和空对象数组
问题描述
目标
如何从 Jackson 在 a 中生成的 JSON 响应中排除所有空 json 对象{}
、数组[]
或空对象数组?[{},{}]
RestController
要求和背景
我正在为客户端构建一个 Spring Boot REST API。API 向数据库发送请求,并且必须生成 JSON 响应。
约束:
- DAO 层发送本地 SQL 查询并以列表的形式接收巨大的数据库结果。开发人员必须使用索引手动将此结果映射到 Java 对象(参见下面的代码)
- SQL 查询返回很多空值(这些查询不能被修改)。由于这些空值,只有空值字段的 Java 对象经常被实例化
要求:
- 所有具有空值的字段都必须从 JSON 响应中排除。已经使用 Jackson
@JsonInclude(JsonInclude.Include.NON_NULL)
注释实现 - 所有空的 json 对象
{}
或数组[]
,或空对象的数组[{},{}]
必须从 JSON 响应中排除。这就是我卡住的地方(请参见下面的示例)
代码
DAO 层中的手动映射:
public List<A> daoMethod() {
List<Object[]> dbResult = getDbResults();
List<A> javaObjects = new ArrayList<>();
// build nested Java objects
for (Object[] line in dbResult) {
A a = new A();
a.setProp1(line[0]);
a.setProp2(line[1]);
// and so on...
javaObjects.add(a);
return javaObjects ;
}
}
控制器方法:
public ResponseEntity<A> controllerMethod() {
List<A> javaObjects = myDao.daoMethod();
return new ResponseEntity(javaObjects, HttpStatus.OK);
}
所有必须在 JSON 响应中序列化的 DTO 类都扩展了BaseDto
该类:
@JsonInclude(JsonInclude.Include.NON_NULL) // removes all fields having NULL value
public abstract class BaseDto implements Serializable{
// some properties...
}
实际和预期结果
当前 JSON 输出:
{
prop1: "some string",
prop2: [{},{},{}],
prop3: [],
prop4: {},
}
预期的:
{
prop1: "some string"
}
解决方案
推荐阅读
- reactjs - 如何使用 React-bootstrap 显示推荐?
- vue.js - 如何使用 AXIOS 在 vuejs 中添加带有 api 密钥的 HEADERS,用于对 RESTFULL API 的 GET 请求
- highcharts - 我们可以在时间线图表的栏中显示文本吗?
- public-key - 从公钥获取可读格式
- hibernate - 使用 Hibernate 5 + JCache + Ehcache 3 的查询缓存不起作用(JBoss / Maven 项目)
- daterangepicker - 如何使用 daterangepicker 选择每个月的最小范围?
- javascript - 将 React 类组件的方法分配给 mobx observable 是好还是坏?
- sql - sql中的嵌套聚合函数
- linux - 在 Docker 中运行脚本时如何重定向终端 STDIN?
- node.js - 使用 SES 的 AWS Cron 作业邮件未交付