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

如何为Java类同时使用多个@JsonInclude注解?

解决@JsonInclude重复注解错误的方法

你遇到的问题是因为低版本Jackson中@JsonInclude并非可重复注解,无法直接添加多个实例。以下是两种可行的解决方式:

方法一:升级Jackson到2.12及以上版本

从Jackson 2.12版本开始,@JsonInclude被标记为@Repeatable(JsonIncludes.class),支持重复使用。升级后你原来的写法就能直接生效:

@JsonInclude(JsonInclude.Include.NON_ABSENT)
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
public class Animal{}

多个@JsonInclude注解的逻辑是或:只要字段满足其中一个规则的排除条件(比如是ABSENT或默认值),就不会被序列化。

方法二:低版本Jackson下自定义过滤逻辑

如果无法升级依赖,可以通过CUSTOM模式实现同时生效两个规则的效果:

步骤1:创建自定义过滤类

实现equals方法来同时判断NON_ABSENT和NON_DEFAULT的条件:

public class NonAbsentAndNonDefaultFilter {
    @Override
    public boolean equals(Object obj) {
        // 处理NON_ABSENT规则:过滤null和Optional.empty()
        if (obj == null) {
            return true;
        }
        if (obj instanceof Optional) {
            return !((Optional<?>) obj).isPresent();
        }

        // 处理NON_DEFAULT规则:过滤等于类型默认值的情况
        Class<?> clazz = obj.getClass();
        if (clazz == Integer.class) {
            return ((Integer) obj) == 0;
        } else if (clazz == Boolean.class) {
            return !((Boolean) obj);
        } else if (clazz == Long.class) {
            return ((Long) obj) == 0L;
        } else if (clazz == String.class) {
            return obj.equals("");
        }

        // 处理自定义对象:判断是否等于默认构造的实例
        try {
            Object defaultInstance = clazz.getDeclaredConstructor().newInstance();
            return obj.equals(defaultInstance);
        } catch (Exception e) {
            // 无法创建默认实例时,不过滤该字段
            return false;
        }
    }
}

步骤2:在类上应用自定义过滤

@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = NonAbsentAndNonDefaultFilter.class)
public class Animal{}

另外,如果你的需求是只要字段为空(含ABSENT)或为默认值就不序列化,也可以尝试使用@JsonInclude(JsonInclude.Include.NON_EMPTY)——但注意NON_EMPTY还包含了空容器/空字符串的过滤逻辑,需要根据实际场景判断是否符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:53:20