目标
如何从RestController
中Jackson生成的JSON响应中排除所有空json对象{}
、数组[]
或空对象数组[{},{}]
?
要求和背景
我正在为一个客户端构建一个SpringBootRESTAPI,这个API向数据库发送请求,并且必须产生一个JSON响应。
约束条件:
- DAO层发送原生SQL查询,并以List的形式接收巨大的DB结果,开发人员必须手动使用索引将此结果Map到Java对象(见下面的代码)
- SQL查询返回大量空值(这些查询不能修改)。由于这些空值,只有空值字段的Java对象经常被示例化
要求:
- JSON响应中必须排除所有具有空值的字段。已使用Jackson
@JsonInclude(JsonInclude.Include.NON_NULL)
注解实现 - 所有空的json对象
{}
或数组[]
,或空对象的数组[{},{}]
必须从JSON响应中排除。这就是我的问题所在(请参见下面的示例)
代码
DAO层中的手动Map:
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"
}
2条答案
按热度按时间fwzugrvs1#
尝试使用NON_EMPTY
值,该值指示只有具有空值或被视为空的属性才不包括在内。
uyhoqukh2#
NON_EMPTY
可用于application.properties
中以排除响应中的空对象(包括空对象)。顺便说一下,
NON_NULL
也适用于仅在响应中移除空对象。