Fastjson2

义项:Java JSON 处理库
Fastjson2

Fastjson2是阿里巴巴开源的Java JSON处理库,是Fastjson 1.x的完全重写版本,目标是为下一个十年提供高性能的JSON库[1][2]。它以同一套API同时支持文本JSON与二进制JSONB两种协议,并原生支持JSONPath、JSON Schema校验,AutoType在默认配置下关闭[3]。2022年4月发布2.0版本,groupId改为com.alibaba.fastjson2[4]。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

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]。

参见

  • JSON —— Fastjson2 处理的数据交换格式,也是其主要输入输出对象

  • 序列化 —— Fastjson2 承担的 Java 对象与文本/二进制格式互转的核心过程

  • JSONPath —— 库内置的路径查询模块,支持对大文档做部分解析

  • JSON Schema —— 库自 2.0.4 起支持的 JSON 结构校验规范

  • GraalVM —— 该库兼容的运行时环境,其 Native Image 场景下部分优化不可用

  • Jackson —— Java 生态中另一款常用的 JSON 处理库,常与本词条对象对比

参考资料

  1. 常见问题 [引用日期2026-10-29]
  2. 0 [引用日期2026-10-29]
  3. FASTJSON 2 Autotype机制介绍 [引用日期2026-10-29]
  4. FASTJSON 2.0 发布,FASTJSON 项目的重要升级 [引用日期2026-10-29]
  5. 性能优化指南 [引用日期2026-10-29]
  6. Fastjon2他来了,性能显著提升,还能再战十年 [引用日期2026-10-29]
  7. FASTJSON v2 JSONSchema Support [引用日期2026-10-29]
  8. Release fastjson 2.0.63版本发布 · alibaba/fastjson2 [引用日期2026-10-29]
  9. [ [引用日期2026-10-29]
  10. Fastjson2你开始使用了吗?来看看源码解析 [引用日期2026-10-29]
  11. Fastjson 2.x远程代码执行漏洞通告 [引用日期2026-10-29]
词条评价
词条统计

浏览次数:0 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:44:55Z

历史版本

本条目引用的词条
JSON Schema GraalVM JSONPath JSON 序列化 Jackson