fastjson通过@jsonfield注解、serializefilter接口及全局序列化器实现字段过滤与自定义序列化:注解支持忽略、重命名和条件序列化;serializefilter(如propertyfilter)支持运行时动态过滤;全局objectserializer统一处理类型格式。

Fastjson 提供了灵活的字段过滤和自定义序列化能力,主要通过 SerializeFilter 接口及其实现类、注解(如 @JSONField)、全局配置等方式实现。关键在于明确控制“哪些字段参与序列化”以及“字段值如何被转换”。
使用 @JSONField 注解控制单个字段行为
这是最轻量、最常用的方式,适用于类级别或字段级别的精细控制。
-
忽略字段:设置
serialize = false,该字段不会出现在 JSON 输出中 -
重命名字段:用
name = "newName"指定输出的 key 名 -
条件性序列化:通过
serialzeUsing指定自定义ObjectSerializer类,或用serialize = true/false配合 getter 方法逻辑(如返回 null 或满足条件才序列化)
示例:
public class User {private String name;
@JSONField(serialize = false)
private String password;
@JSONField(name = "nick_name")
private String nickname;
@JSONField(serialzeUsing = DateSerializer.class)
private Date createTime;
}
通过 SerializeFilter 实现动态字段过滤
适合运行时根据规则(如权限、环境、用户角色)动态决定是否序列化某字段或对象。
- PropertyPreFilter:在序列化前判断是否包含某个属性,可按类名 + 属性名精确控制
- PropertyFilter:可访问属性值,支持基于值内容的过滤(如隐藏敏感字段值为 null 或空字符串的项)
- ContextValueFilter:支持嵌套层级上下文,可用于对 List 中每个元素单独应用过滤逻辑
示例(过滤所有 password 字段):
PropertyPreFilter filter = new PropertyPreFilter() {public boolean apply(JSONSerializer serializer, Object object, String name) {
return !"password".equals(name);
}
};
String json = JSON.toJSONString(user, filter);
注册全局自定义序列化器(ObjectSerializer)
当需要统一处理某类类型(如 LocalDateTime、BigDecimal、枚举等)的输出格式时,推荐注册全局序列化器。
- 实现
ObjectSerializer接口,重写write方法 - 调用
JSON.registerSerializer(Class<t>, ObjectSerializer)</t>注册 - 后续所有该类型的字段都会走此逻辑,无需重复加注解
例如将 LocalDateTime 统一格式化为 "yyyy-MM-dd HH:mm:ss",只需注册一次即可生效于所有相关字段。
注意 Fastjson 版本差异与安全建议
Fastjson 1.2.83+ 默认关闭 autoType,且部分旧版过滤机制(如 SimplePropertyPreFilter 的构造方式)有调整。建议:
- 升级到 1.2.83 或更高稳定版本
- 避免在生产环境启用
ParserConfig.getGlobalInstance().setAutoTypeSupport(true) - 字段过滤优先使用白名单式
SimplePropertyPreFilter,而非黑名单式排除 - 如项目允许,考虑迁移到 Alibaba Fastjson2(更快、更安全、API 更清晰)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











