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.832023-05-25最后稳定版,默认关闭 AutoType,修复多个反序列化漏洞
1.2.802022-09-13增强了 JSONPath,优化序列化性能
1.2.762021-11-08支持 JDK 17,增加 JSONValidator
1.2.732021-06-25修复泛型反序列化问题,提升 Kotlin 兼容性
1.2.702021-03-15引入 SafeMode 安全模式
1.2.682020-08-21增加 AutoType 黑名单机制
1.2.602019-11-08性能优化,支持 WriteNullStringAsEmpty 等常用特性
1.2.542019-05-28大幅提升 JSONB 支持(实验性)
1.2.472018-12-25高危漏洞版本(AutoType绕过),强烈建议升级
1.2.312017-08-28首次引入 TypeReference 解决泛型丢失问题
1.1.68.android2017-06-08为 Android 环境优化的专用版本
1.1.152013-03-15早期主流版,奠定高性能基础

安全提醒:若项目中仍使用 1.2.47 及之前的版本,请立即升级至 1.2.83+ 或迁移到 Fastjson2

Fastjson 1.x vs 2.x 核心差异对比

很多团队正在评估是否升级。下表从实际开发者视角对比两代库的关键区别:

对比项Fastjson 1.xFastjson 2.x
包名com.alibaba.fastjsoncom.alibaba.fastjson2
最低 JDKJDK 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. 升级到 1.2.83+
    1.2.83 版本默认将 safeMode 设为 true,不再自动执行任意类加载。

  2. 手动开启 SafeMode(低版本也适用):

    ParserConfig.getGlobalInstance().setSafeMode(true); 
  3. 使用 @JSONType 白名单
    为需要反序列化的类显式标注:

    @JSONType(seeAlso = {User.class, Admin.class})
    public BaseUser { } 
  4. 不推荐使用 JSON.parseObject(json, Object.class)
    应始终指定具体目标类,防止注入攻击。

总结

Fastjson 1.x 久经考验、生态丰富,但在新项目中已逐渐被更安全、更快的 Fastjson2 取代。如果你仍在使用 1.x:

  •  务必升级到 1.2.83 或更高版本;
  •  开启 SafeMode 或配置合理的 AutoType 白名单;
  •  对泛型场景坚持使用 TypeReference