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

xe55xuns  于 2022-12-25  发布在  Java
关注(0)|答案(2)|浏览(434)

目标

如何从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"
}
fwzugrvs

fwzugrvs1#

尝试使用NON_EMPTY

@JsonInclude(JsonInclude.Include.NON_EMPTY)

值,该值指示只有具有空值或被视为空的属性才不包括在内。

uyhoqukh

uyhoqukh2#

NON_EMPTY可用于application.properties中以排除响应中的空对象(包括空对象)。

spring.jackson.default-property-inclusion=NON_EMPTY

顺便说一下,NON_NULL也适用于仅在响应中移除空对象。

相关问题