Fastjson1 Maven
作为国内使用最广泛的 JSON 处理库之一,Fastjson 1.x 凭借“快”和“省”的特点,在无数 Java 项目中扮演着关键角色。本文系统梳理 Fastjson 1.x 的核心依赖、历史版本、与下一代 Fastjson2 的差异,并提供安全可靠的集成方案。
Fastjson 1.x Maven 核心依赖
在 Maven 项目的 pom.xml 中直接引入即可使用 Fastjson 1.x。
建议选用 1.2.83 及以上版本(修复了已知 AutoType 安全风险)。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
若需兼容更旧 JDK 6/7,可选 1.1.68.android 或 1.2.83 均可。
Fastjson 1.x 主要版本演进表
Fastjson 1.x 自 2011 年发布以来,迭代超过 10 年。下表列出关键里程碑版本及建议:
| 版本号 | 发布日期 | 状态 / 说明 |
|---|---|---|
| 1.2.83 | 2023-05-25 | 最后稳定版,默认关闭 AutoType,修复多个反序列化漏洞 |
| 1.2.80 | 2022-09-13 | 增强了 JSONPath,优化序列化性能 |
| 1.2.76 | 2021-11-08 | 支持 JDK 17,增加 JSONValidator |
| 1.2.73 | 2021-06-25 | 修复泛型反序列化问题,提升 Kotlin 兼容性 |
| 1.2.70 | 2021-03-15 | 引入 SafeMode 安全模式 |
| 1.2.68 | 2020-08-21 | 增加 AutoType 黑名单机制 |
| 1.2.60 | 2019-11-08 | 性能优化,支持 WriteNullStringAsEmpty 等常用特性 |
| 1.2.54 | 2019-05-28 | 大幅提升 JSONB 支持(实验性) |
| 1.2.47 | 2018-12-25 | 高危漏洞版本(AutoType绕过),强烈建议升级 |
| 1.2.31 | 2017-08-28 | 首次引入 TypeReference 解决泛型丢失问题 |
| 1.1.68.android | 2017-06-08 | 为 Android 环境优化的专用版本 |
| 1.1.15 | 2013-03-15 | 早期主流版,奠定高性能基础 |
安全提醒:若项目中仍使用 1.2.47 及之前的版本,请立即升级至 1.2.83+ 或迁移到 Fastjson2。
Fastjson 1.x vs 2.x 核心差异对比
很多团队正在评估是否升级。下表从实际开发者视角对比两代库的关键区别:
| 对比项 | Fastjson 1.x | Fastjson 2.x |
|---|---|---|
| 包名 | com.alibaba.fastjson | com.alibaba.fastjson2 |
| 最低 JDK | JDK 6+ | JDK 8+(深度利用 JDK 11/17 新特性) |
| 安全性 | AutoType 默认开启(旧版),需手动配置关闭;多次曝出 RCE 漏洞 | AutoType 默认关闭,架构级安全重写,无历史漏洞 |
| 性能 | 基准测试中领先多数同类库 | 再提升 50%~150%,利用 SIMD、内存零拷贝等现代硬件特性 |
| JSONB 支持 | 早期实验支持 (1.2.54+) | 原生高性能二进制 JSONB,适合 RPC 场景 |
| API 兼容性 | JSON.parseObject / toJSONString | 完全兼容 1.x 常用 API,可平滑切换(需改包名) |
| GraalVM 原生镜像 | 部分支持 | 原生支持,反射配置自动生成 |
| 维护状态 | 已进入维护期(仅修高危 bug) | 活跃开发(每月发布新版本) |
结论:新项目请直接使用 Fastjson2;现有 1.x 项目若想降低安全风险,可升级至 1.2.83 并开启 SafeMode,或通过 fastjson2-extension 兼容包渐进迁移。
Spring Boot 中集成 Fastjson 1.x
在 Spring MVC / Spring Boot 环境下,替换默认的 Jackson,使用 Fastjson 作为 HTTP 消息转换器:
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public Fastjson1Config implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
// 创建 Fastjson 转换器
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
// 全局日期格式
config.setDateFormat("yyyy-MM-dd HH:mm:ss");
// 常用特性:输出 null 字段、美化输出、禁用循环引用检测
config.setSerializerFeatures(
SerializerFeature.WriteMapNullValue,
SerializerFeature.PrettyFormat,
SerializerFeature.DisableCircularReferenceDetect
);
converter.setFastJsonConfig(config);
// 将 Fastjson 转换器放在第一位,优先使用
converters.add(0, converter);
}
}
测试代码:
@RestController
public TestController {
@GetMapping("/user")
public User getUser() {
return new User("Tom", 25);
}
}
// 输出示例: {"age":25,"name":"Tom","remark":null}
泛型TypeReference 的正确用法
Fastjson 1.x 中最容易踩的坑是泛型擦除。反序列化 List<User> 时必须使用 TypeReference:
// 错误:丢失泛型,得到 List<JSONObject>
List list = JSON.parseObject(json, List.class);
// 正确:保留泛型信息
List<User> users = JSON.parseObject(json, new TypeReference<List<User>>() {});
更完整的示例:
String json = "[{\"name\":\"Jerry\",\"age\":23}]";
List<User> userList = JSON.parseObject(json, new TypeReference<List<User>>() {});
System.out.println(userList.get(0).getName()); // Jerry
安全使用指南(针对 AutoType)
升级到 1.2.83+
1.2.83版本默认将safeMode设为 true,不再自动执行任意类加载。手动开启 SafeMode(低版本也适用):
ParserConfig.getGlobalInstance().setSafeMode(true);使用
@JSONType白名单
为需要反序列化的类显式标注:@JSONType(seeAlso = {User.class, Admin.class}) public BaseUser { }不推荐使用
JSON.parseObject(json, Object.class)
应始终指定具体目标类,防止注入攻击。
总结
Fastjson 1.x 久经考验、生态丰富,但在新项目中已逐渐被更安全、更快的 Fastjson2 取代。如果你仍在使用 1.x:
- 务必升级到 1.2.83 或更高版本;
- 开启
SafeMode或配置合理的 AutoType 白名单; - 对泛型场景坚持使用
TypeReference。

