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

时间:2019-06-20 12:15:07

标签: java spring-boot jackson

目标

如何从杰克逊在{}中产生的JSON响应中排除所有空的json对象[],数组[{},{}]或空对象RestController? >

需求和背景

我正在为客户端构建Spring Boot REST API。 该API将请求发送到数据库,并且必须产生JSON响应。

约束:

  • DAO层发送本机SQL查询,并接收大量DB结果作为列表。开发人员必须使用索引将结果手动映射到Java对象(请参见下面的代码)
  • SQL查询返回很多空值(这些查询无法修改)。由于存在这些空值,因此经常实例化仅具有空值字段的Java对象

要求:

  • 所有具有空值的字段都必须从JSON响应中排除。已经使用杰克逊@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"
}

2 个答案:

答案 0 :(得分:0)

尝试使用NON_EMPTY

import os

path = 'c:\\projects\\hc2\\'

files = []
# r=root, d=directories, f = files
for r, d, f in os.walk(path):
    for file in f:
        if '.txt' in file:
            files.append(os.path.join(r, file))

for f in files:
    print(f)
  

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

答案 1 :(得分:0)

您可以使用JsonInclude.Include.NON_EMPTY。要使用此选项全局配置对象映射器,请为您的Spring Boot应用程序在配置中创建一个bean:

*mut c_char