Fastjson2 和 Fastjson1 对比

如果你刚接触JSON解析,或者项目里还在用老版本的Fastjson,这篇文章可以帮你了解两者有什么不同,以及怎么从Fastjson1升级到Fastjson2。

一、为什么要有Fastjson2?

Fastjson1曾是国内最流行的JSON库之一,以其极快的解析速度闻名。但随着时间推移,其设计上的一些缺陷逐渐暴露,尤其是安全问题(比如反序列化漏洞)和架构扩展性不足。Fastjson2作为完全重写的版本,不仅修复了这些问题,还带来了更好的性能和更现代的设计。

你可能关心的核心变化:

  • 安全性:默认关闭了autoType,不再默认支持反序列化任意类
  • 速度:通过优化JSONB格式,解析速度提升20%~50%
  • API:统一了JSONB和JSON的API,支持JDK 8+的新特性

二、代码对比

1. 基础序列化/反序列化

Fastjson1 写法

// 序列化
String json = JSON.toJSONString(user);
// 反序列化
User user = JSON.parseObject(json, User.class);

Fastjson2 写法

// 序列化(核心API不变,但内部优化)
String json = JSON.toJSONString(user);
// 反序列化(支持泛型推断)
User user = JSON.parseObject(json, User.class);

看起来几乎一样?没错,Fastjson2保持了高度兼容性。但注意:

  • Fastjson2默认关闭了autoType
  • 如果反序列化需要自定义类型,必须显式指定

2. 处理泛型集合

Fastjson1

List<User> list = JSON.parseArray(json, User.class);

Fastjson2(更简洁):

List<User> list = JSON.parseObject(json, new TypeReference<List<User>>(){}.getType());
// 或者使用新的静态方法
List<User> list = JSON.parseArray(json, User.class); // 依然兼容

3. 性能差异演示

下面是一个简单的压测对比(单线程,重复1万次):

// Fastjson1
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
    String json = JSON.toJSONString(user);
    User parsed = JSON.parseObject(json, User.class);
}
System.out.println("Fastjson1: " + (System.currentTimeMillis() - start) + "ms");

// Fastjson2
start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
    String json = JSON.toJSONString(user);
    User parsed = JSON.parseObject(json, User.class);
}
System.out.println("Fastjson2: " + (System.currentTimeMillis() - start) + "ms");

实测结果(仅供参考,依赖环境):

  • Fastjson1: 约450ms
  • Fastjson2: 约320ms
    提升约30%

4. JSONB格式支持

Fastjson2引入了二进制JSON格式JSONB,它是Fastjson2独有的,适合高性能场景:

// 序列化为JSONB
byte[] jsonbBytes = JSONB.toBytes(user);
// 反序列化
User user = JSONB.parseObject(jsonbBytes, User.class);

对于RPC或缓存场景,直接使用二进制格式能减少序列化开销。

三、迁移注意事项

  1. 配置变化JSON.DEFAULT_PARSER_FEATURE等配置类被移除,改用JSONReader.Feature
  2. 安全配置:如果需要支持autoType,必须显式开启:
    JSON.config(JSONReader.Feature.SupportAutoType);
  3. 依赖冲突:如果项目同时存在fastjson1和fastjson2的Maven依赖,注意排除旧版。

四、什么时候该升级?

  • 新项目:直接使用Fastjson2,享受更好的安全性和性能
  • 老项目:如果遇到安全问题或性能瓶颈,建议逐步替换
  • 依赖情况:如果项目依赖的其他库使用了Fastjson1,优先升级那些库再替换

结语

Fastjson2不是简单的版本升级,而是一次彻底的架构革新。对于初学者,建议直接学习Fastjson2,因为它更安全、更快,且API保持简洁。如果你还在使用Fastjson1,不妨花一天时间完成迁移,性价比很高。