Fastjson2
定义
Fastjson2是阿里巴巴维护的开源Java程序库,作用是在Java对象与JSON文本之间双向转换,即序列化与反序列化。它在Maven中的坐标为com.alibaba.fastjson2,与1.x版本的包名com.alibaba.fastjson不同,因此两代库可以在同一个工程内并行存在[1]。项目采用Apache 2.0许可证发布,维护方为阿里巴巴集团。
除核心的文本JSON解析器与生成器外,该库还内置了二进制格式JSONB、路径查询模块与JSON Schema校验模块,对外提供了一套统一的API入口[2]。核心库要求Java 8及以上,完整功能需要Java 11及以上,Vector API相关优化在Java 17及以上生效;面向Android平台时最低要求Android 8(API级别26)[1]。
原理
序列化的基本流程是先用Class分析某个类型中需要写出的字段,再为每个字段构造一个FieldWriter,接着借助ASM在运行时生成该类型专属的ObjectWriter字节码类,加载实例化并缓存起来,之后同类对象的序列化就直接复用这个生成类[5]。生成类中把字段名哈希组织成switch-case分支,使反序列化时的字段查找达到近似常数级的时间复杂度[5]。当ASM不可用(如Android环境或GraalVM Native Image)时,转而采用反射或lambda形式的创建器[1]。
解析器按输入编码做了区分,分别有针对UTF-8字节流、UTF-16字符串和纯ASCII内容的实现,库会根据输入自动选择[5]。字段名通过名称表做字符串驻留,以减少解析过程中的对象分配[5]。在JDK 8及以上,getter与setter调用可借助LambdaMetafactory生成方法句柄,以接近直接调用的方式替代反射[5]。
类型安全方面,序列化时若启用AutoType特性,输出的JSON中会附加@type类型信息,反序列化时无需传入目标类型即可自动识别[3]。该特性必须显式开启,库中不含任何硬编码白名单;开启后还会经过内置黑名单过滤,官方文档同时指出黑名单不足以保证绝对安全,不应在公网暴露的场景中启用[3]。配置safeMode可彻底禁用AutoType,即使代码中显式指定类型参数也不再生效[3]。
发展历程
Fastjson项目早期的1.1.x版本于2011年发布,长期作为Java生态中流行的JSON库使用[6]。作为该项目的重要升级,Fastjson2定位为面向下一个十年的重写版本,2022年4月18日前后发布2.0版本,并在短时间内推出2.0.1[4]。新版本调整了Maven坐标与包名,官方同时提供了面向1.2.x的兼容包,但说明兼容包不保证百分之百兼容[4]。
2.0.4版本起,库中加入了对JSON Schema的支持,可依据schema对输入的JSON数据做校验[7]。2.0.63版本起,通过accept前缀注册的类型不再自动放行ClassLoader子类以及JDK SQL的DataSource、RowSet实现,只有写全类名的条目才被视为显式授权[3]。2026年7月29日发布的2.0.63同时是一个安全修复版本,加固了AutoType相关的类型名与白名单校验,并修复了若干可由构造输入触发的解析健壮性问题[8]。
应用
该库主要面向Java服务端、Android客户端以及大数据处理三类场景,官方说明其设计覆盖全量解析与部分解析两种使用方式[2]。典型的调用方式包括把JSON字符串或UTF-8字节数组解析为JSONObject、JSONArray,以及直接反序列化为指定的Java类型;反向则把对象输出为字符串或字节数组[9]。
对于服务之间的内部通信,可以使用JSONB二进制格式,官方文档称其相比文本JSON具有更快的处理速度和更小的数据体积,配合BeanToArray特性还能进一步压缩[5]。JSONPath用于从大体积文档中只取出所需字段,无需完整反序列化,路径对象可以缓存并在多个线程间复用[9]。JSON Schema支持则用于对入参做结构约束与取值校验,例如限定经纬度的取值范围[7]。
工程集成方面,除标准构件外,项目还提供Kotlin集成模块与面向Spring等框架的扩展模块,以及面向Android 5、Android 8的针对性构建版本[2]。若既有系统仍使用1.2.x,可通过兼容构件替换,但官方提醒迁移前需充分测试[4]。
局限
性能表现并非在所有条件下都占优。有开发者以相同堆内存设置做对比测试,发现Fastjson2的内存开销更大,堆空间较小时会因频繁垃圾回收导致耗时反超1.x版本,把堆空间放大后差距才逐步缩小[10]。该结论来自第三方测试,与官方基准数据并不一致,实际表现需结合具体数据规模与JVM参数评估[5]。
安全边界方面,官方文档明确说明AutoType开启后的内置黑名单只能拦截多数常见风险,无法保证绝对安全[3]。绿盟科技CERT发布的通告指出,2.0.62及以前的版本在未启用SupportAutoType时,仍可能通过内建白名单处理JSON中的@type,存在被构造数据绕过的风险,官方已在后续版本中修补[11]。
兼容性与运行环境也存在限制。兼容构件与1.x共用包名,因此不能与旧版本同时出现在一个工程中;智能字段匹配、自动类型识别等特性在2.x中默认关闭,与1.x的默认行为不同,迁移时需要显式配置[1]。在GraalVM Native Image中无法使用基于ASM的代码生成,性能优化手段会相应减少[1]。此外,JSONObject与JSONArray不做同步处理,JSONReader与JSONWriter也不可在多线程间共享,需按每次操作单独创建[5]。
参见
参考资料
- 常见问题 [引用日期2026-10-29]
- 0 [引用日期2026-10-29]
- FASTJSON 2 Autotype机制介绍 [引用日期2026-10-29]
- FASTJSON 2.0 发布,FASTJSON 项目的重要升级 [引用日期2026-10-29]
- 性能优化指南 [引用日期2026-10-29]
- Fastjon2他来了,性能显著提升,还能再战十年 [引用日期2026-10-29]
- FASTJSON v2 JSONSchema Support [引用日期2026-10-29]
- Release fastjson 2.0.63版本发布 · alibaba/fastjson2 [引用日期2026-10-29]
- [ [引用日期2026-10-29]
- Fastjson2你开始使用了吗?来看看源码解析 [引用日期2026-10-29]
- Fastjson 2.x远程代码执行漏洞通告 [引用日期2026-10-29]