【发布时间】:2019-06-20 12:15:07
【问题描述】:
目标
如何从 Jackson 在 RestController 中生成的 JSON 响应中排除所有空 json 对象 {}、数组 [] 或空对象数组 [{},{}]?
要求和背景
我正在为客户端构建 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"
}
【问题讨论】:
-
您找到解决方案了吗?我有同样的问题。我也试过 JsonInclude.NON_EMPTY,JsonInclude.NON_NULL 但没有任何运气
-
有人有解决方案吗??
标签: java spring-boot jackson