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。例如:

  • JSONJSON(同名但包不同)
  • JSONObjectJSONObject
  • JSONArrayJSONArray

基础用法迁移

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");

迁移步骤总结

  1. 替换Maven依赖:从 fastjson 换成 fastjson2
  2. 修改导入:将所有 com.alibaba.fastjson 改为 com.alibaba.fastjson2
  3. 检查自定义扩展:如 ObjectSerializer 等,需要适配2.x接口
  4. 测试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,老项目按模块逐步升级。