fastjson2 中通过自定义注解(如 @jsonignoreif)结合 objectwriterfilter 实现字段动态过滤:定义运行时保留的字段级注解,继承 objectwriterfilter 并在 accept 方法中反射解析注解条件,支持集成 jexl 等表达式引擎或简单规则判断,可通过 writerconfig 局部注册或全局配置,并利用 jsonwritercontext 传入上下文参数实现线程安全的运行时状态感知。

Fastjson2 中自定义注解结合 Filter 实现字段过滤,核心是通过实现 ObjectWriterFilter 或 PropertyPreFilter,并在其中解析自定义注解(如 @JsonIgnoreIf)来动态决定是否序列化某个字段。
定义自定义注解
先创建一个运行时保留、作用于字段的注解,比如控制“在特定条件下忽略序列化”:
- 注解需标注
@Retention(RetentionPolicy.RUNTIME)和@Target(ElementType.FIELD) - 可携带参数,例如布尔开关、条件表达式或环境标识
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface JsonIgnoreIf {
String value() default ""; // 如 "userRole == 'GUEST'"
boolean condition() default true;
}
编写 Filter 解析注解逻辑
继承 ObjectWriterFilter,重写 accept 方法,在其中获取字段的注解并判断是否跳过:
- 通过
context.getObjectClass()和context.getFieldName()定位当前字段 - 用反射获取该字段上的
@JsonIgnoreIf注解 - 根据注解值(如表达式或简单布尔)执行判断,返回
false表示过滤该字段
userRole == 'GUEST'),需集成 JEXL、Aviator 等轻量表达式库,或只支持简单规则(如枚举值匹配、环境变量判断)。
注册 Filter 到 Writer 配置
Filter 需绑定到 JSONWriter 或全局配置中:
- 局部使用:调用
JSON.toJSONString(obj, writerConfig),其中writerConfig.setObjectWriterFilter(yourFilter) - 全局设置:通过
JSONFactory.getDefaultWriterContext().setObjectWriterFilter(...) - 也可在
@JSONType中指定writerFilter类,但仅对标注类生效
配合 JSONWriterContext 实现上下文感知
如果过滤逻辑依赖运行时状态(如当前用户权限、请求场景),可通过 JSONWriterContext 传入上下文参数:
- 在序列化前,用
writerConfig.setAttribute("currentUserRole", "GUEST") - Filter 中通过
context.getAttribute("currentUserRole")获取并参与判断 - 避免静态变量或 ThreadLocal,保持线程安全和可测试性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











