【问题标题】:Exclude empty objects, empty arrays and arrays of empty objects from json response从 json 响应中排除空对象、空数组和空对象数组
【发布时间】: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


【解决方案1】:

尝试使用NON_EMPTY

@JsonInclude(JsonInclude.Include.NON_EMPTY) 

表示只有具有空值的属性或被视为空的属性不包含在内的值。

【讨论】:

  • 谢谢。我尝试将此注释与不同的组合(类级别、类型级别...)一起使用,但它不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 2021-01-04
  • 2019-04-02
  • 2016-11-26
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
相关资源
最近更新 更多