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

如何在Jackson序列化时忽略空Optional字段

解决Jackson序列化忽略值为null的Optional字段问题

问题原因

你当前配置的JsonInclude.Include.NON_NULL仅会忽略字段本身为null的情况,但secondName对应的Optional对象本身并非null,只是它包裹的值为null,因此Jackson会把这个空Optional序列化成null,无法达到你想要的忽略效果。

解决方案

方案一:改用JsonInclude.Include.NON_ABSENT

将序列化包含规则替换为NON_ABSENT,它会同时忽略空Optional对象和null值:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new Jdk8Module());
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_ABSENT);
System.out.println(objectMapper.writeValueAsString(employee));

方案二:配置Jdk8Module忽略空Optional

注册Jdk8Module时,关闭configureAbsentsAsNulls配置,让空Optional直接被忽略而非序列化成null:

ObjectMapper objectMapper = new ObjectMapper();
Jdk8Module jdk8Module = new Jdk8Module();
jdk8Module.configureAbsentsAsNulls(false);
objectMapper.registerModule(jdk8Module);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
System.out.println(objectMapper.writeValueAsString(employee));

方案三:针对特定字段添加注解

如果只需对部分Optional字段生效,可以在对应的get方法上添加@JsonInclude(JsonInclude.Include.NON_ABSENT)注解:

class Employee {
    private String firstName;
    private String secondName;

    @JsonInclude(JsonInclude.Include.NON_ABSENT)
    public Optional<String> getFirstName() {
        return Optional.ofNullable(firstName);
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @JsonInclude(JsonInclude.Include.NON_ABSENT)
    public Optional<String> getSecondName() {
        return Optional.ofNullable(secondName);
    }

    public void setSecondName(String secondName) {
        this.secondName = secondName;
    }
}

应用上述任意方案后,都会得到你期望的序列化结果:

{"firstName":"foo"}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 13:29:09