从 json 响应中排除空对象、空数组和空对象数组

ora*_*001 5 java jackson spring-boot

目标

如何从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 ;
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器方法:

public ResponseEntity<A> controllerMethod() {
    List<A> javaObjects = myDao.daoMethod();
    return new ResponseEntity(javaObjects, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)

所有必须在 JSON 响应中序列化的 DTO 类都扩展了该类BaseDto

@JsonInclude(JsonInclude.Include.NON_NULL) // removes all fields having NULL value
public abstract class BaseDto implements Serializable{
    // some properties...
}
Run Code Online (Sandbox Code Playgroud)

实际和预期结果

当前 JSON 输出:

{
  prop1: "some string",
  prop2: [{},{},{}],
  prop3: [],
  prop4: {},
}
Run Code Online (Sandbox Code Playgroud)

预期的:

{
  prop1: "some string"
}
Run Code Online (Sandbox Code Playgroud)

use*_*900 1

尝试使用NON_EMPTY

@JsonInclude(JsonInclude.Include.NON_EMPTY) 
Run Code Online (Sandbox Code Playgroud)

指示仅不包含具有空值或被视为空的属性的值。

  • 谢谢。我尝试将此注释与不同的组合(类级别、类型级别...)一起使用,但它不起作用 (2认同)