You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中ObjectMapper空值处理及API返回保留空对象结构问题

解决ObjectMapper序列化时保留空数组的问题

我来帮你搞定这个Jackson序列化空数组被过滤的问题——这是个挺常见的场景,默认配置确实会把空集合(包括空数组)当成“空值”给过滤掉,所以才会出现你看到的links和embedded变成空对象的情况。下面给你几种可行的解决方案:

1. 全局配置ObjectMapper(适用于所有序列化场景)

如果你希望整个应用的序列化都保留空数组(只过滤null值),可以直接修改ObjectMapper的序列化包含规则:

ObjectMapper objectMapper = new ObjectMapper();
// 只排除null值,空集合/空数组会被保留
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

如果是Spring Boot项目,还可以通过配置文件全局生效,不用写代码:

application.properties

spring.jackson.serialization-inclusion=non_null

application.yml

spring:
  jackson:
    serialization:
      inclusion: non_null

2. 针对特定类/字段精准配置(更灵活)

如果不想全局修改规则,只想让特定的类或字段保留空数组,可以用@JsonInclude注解:

类级别配置(整个类的字段都遵循此规则)

@JsonInclude(JsonInclude.Include.NON_NULL)
public class ApiResponse {
    private Links links;
    private Embedded embedded;
    
    // getter、setter方法
}

// 对应的Links和Embedded类同样可以加注解
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Links {
    private List<String> products;
    private List<String> packages;
    
    // getter、setter方法
}

字段级别配置(仅指定字段保留空数组)

如果只想让某个特定字段保留空数组,其他字段依然过滤空值,可以直接在字段上加注解:

public class Links {
    @JsonInclude(JsonInclude.Include.ALWAYS)
    private List<String> products;
    
    @JsonInclude(JsonInclude.Include.ALWAYS)
    private List<String> packages;
    
    // getter、setter方法
}

3. 验证效果

配置完成后,再序列化你的响应对象,就能得到你期望的格式:

{"links": {"products": [], "packages": []}, "embedded":{"products": [], "packages": []}}

内容的提问来源于stack exchange,提问作者ammy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:25:40