Fastjson2 从1.x迁移到2.x
为什么需要迁移
Fastjson2(版本2.x)是阿里巴巴Fastjson的重大升级版本,相比1.x版本,它修复了大量安全漏洞、提升了性能,并引入了更现代的API设计。如果是新项目建议直接使用fastjons2.x版本。
核心变化:包名与Maven坐标
1.x
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
2.x
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.61</version>
</dependency>
包名变化:所有类从 com.alibaba.fastjson 迁移到 com.alibaba.fastjson2。例如:
JSON→JSON(同名但包不同)JSONObject→JSONObjectJSONArray→JSONArray
基础用法迁移
1. 序列化与反序列化
1.x写法
import com.alibaba.fastjson.JSON;
User user = new User("张三", 28);
String json = JSON.toJSONString(user); // 序列化
User user2 = JSON.parseObject(json, User.class); // 反序列化
2.x写法
import com.alibaba.fastjson2.JSON;
User user = new User("张三", 28);
String json = JSON.toJSONString(user); // 序列化(方法名一致)
User user2 = JSON.parseObject(json, User.class); // 反序列化
注意:2.x的 JSON 类位于 com.alibaba.fastjson2,IDE会自动区分。
2. JSONObject 操作
创建与访问
// 1.x方式
JSONObject obj1 = new JSONObject();
obj1.put("name", "李四");
// 2.x方式(同样兼容)
JSONObject obj2 = JSONObject.of("name", "王五");
obj2.put("age", 30); // 仍然支持put
// 读取
String name = obj2.getString("name"); // 推荐使用类型化getter
int age = obj2.getIntValue("age");
3. 日期处理
Fastjson2增强了日期支持,默认ISO8601格式:
// 序列化日期
User user = new User("赵六", new Date());
String json = JSON.toJSONString(user);
// 输出: {"name":"赵六","birthday":"2026-05-08 14:28:41.779"}
// 自定义格式
import com.alibaba.fastjson2.JSONWriter.Feature;
String json2 = JSON.toJSONString(user, "yyyy-MM-dd HH:mm:ss");
关键配置变化
全局配置
推荐使用LocalConfig替代
// 1.x方式
JSON.DEFAULT_PARSE_FEATURE = ...
// 2.x方式 - 推荐局部配置
String json = JSON.toJSONString(obj,
JSONWriter.Feature.PrettyFormat,
JSONWriter.Feature.WriteNulls);
过滤字段
使用Filter替代PropertyFilter
// 1.x
SimplePropertyPreFilter filter = new SimplePropertyPreFilter("name");
String json = JSON.toJSONString(obj, filter);
// 2.x 更简洁
String json = JSON.toJSONString(obj, "name", "age");
安全增强
Fastjson2默认关闭了autoType功能,更安全:
// 反序列化时如果遇到多态类型,需要显式指定
String json = "{\"@type\":\"com.example.User\"}";
User user = JSON.parseObject(json, User.class); // 直接指定类型更安全
性能对比
在相同场景下,Fastjson2比1.x快约20%-40%,内存占用更少。以下简单测试代码:
// 测试序列化100万次
long start = System.currentTimeMillis();
for (int i = 0; i < 1_000_000; i++) {
JSON.toJSONString(new User("test", i));
}
System.out.println("耗时:" + (System.currentTimeMillis() - start) + "ms");
迁移步骤总结
- 替换Maven依赖:从
fastjson换成fastjson2 - 修改导入:将所有
com.alibaba.fastjson改为com.alibaba.fastjson2 - 检查自定义扩展:如
ObjectSerializer等,需要适配2.x接口 - 测试API兼容性:大部分1.x的API在2.x中保留,但部分废弃方法建议替换
常见问题
Q:1.x的有些API在2.x中找不到?
A:如 JSON.toJSONStringWithDateFormat(),2.x改用 JSONWriter.Feature 实现。
Q:迁移后序列化结果不同?
A:检查是否依赖了1.x的默认行为(如字段排序),2.x默认排序不同,可设置 JSONWriter.Feature.SortField 保持兼容。
Fastjson2的迁移总体平滑,建议在新项目中直接使用2.x,老项目按模块逐步升级。

