如何为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
相关产品推荐
相关产品推荐

