Fastjson2 是什么
Fastjson2 是 FASTJSON 项目的下一代高性能 JSON 库。它是对原先 Fastjson 版本的完全重构,旨在提供极致的性能体验。作为一款 Java 语言编写的 JSON 处理器,它能够极大地提升 JSON 序列化与反序列化的速度,并彻底解决了旧版本中存在的许多安全漏洞。
Fastjson2 下载与集成
推荐使用 Maven 或 Gradle 构建工具自动集成 Fastjson2。可在 Fastjson2 Maven 上查看最新发布版本。目前稳定版本为 2.0.61系列。
Maven 依赖:
com.alibaba.fastjson2:fastjson2:2.0.61最新更新日期:2026-02-07
Fastjson2 安装与配置
1. 在 Maven 项目的 pom.xml 中添加依赖
<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>2.0.61</version> </dependency>
2. 如果是 Android 项目,请使用专门的 android 版本:
<dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2-android</artifactId> <version>2.0.61</version> </dependency>
Fastjson2 切换国内镜像
由于 Maven 中央仓库在国内访问较慢,建议在 settings.xml 中配置阿里云镜像源,以加快依赖库的下载速度:
阿里云镜像配置:
<mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>
常用核心方法提示
JSON.toJSONString(obj):将 Java 对象序列化为 JSON 字符串。JSON.parseObject(jsonStr, Class.class):将 JSON 字符串反序列化为特定的 Java 对象。JSON.parseArray(jsonStr, Class.class):将 JSON 字符串反序列化为对象列表。JSONPath.eval(obj, path):使用 JSONPath 语法从对象中快速提取数据。JSONB.encode(obj):将对象编码为 Fastjson2 特有的二进制 JSONB 格式,性能更高。JSONObject.from(obj):将普通 POJO 对象转换为 JSONObject 对象。
序列化 Java 对象
String text = JSON.toJSONString(user); 将对象转换为 JSON 文本。
可以使用 JSONWriter.Feature 参数来自定义序列化行为,例如格式化输出:
String text = JSON.toJSONString(user, JSONWriter.Feature.PrettyFormat);
看下面的Java对象序列化的例子
import com.alibaba.fastjson2.JSON;
import java.time.LocalDate;
// 定义一个简单的实体类
public class User {
private String name;
private int age;
private LocalDate birthday;
// 构造器、getter/setter 省略(可使用 Lombok @Data)
}
// 序列化
User user = new User();
user.setName("张三");
user.setAge(30);
user.setBirthday(LocalDate.of(1996, 5, 15));
String jsonString = JSON.toJSONString(user);
System.out.println(jsonString);
// 输出:{"age":30,"birthday":"1996-05-15","name":"张三"}
反序列化 JSON
User user = JSON.parseObject(jsonStr, User.class); 这是最常用的反序列化方式。
如果数据是数组格式,使用:List<User> users = JSON.parseArray(jsonStr, User.class);
看下面反序列化json的例子
String json = "{\"name\":\"李四\",\"age\":32,\"birthday\":\"1994-08-20\"}";
User user = JSON.parseObject(json, User.class);
System.out.println(user.getName()); // 输出:李四
System.out.println(user.getAge()); // 输出:32
处理集合与泛型
// 列表反序列化
List<User> users = JSON.parseArray("[{\"name\":\"A\"},{\"name\":\"B\"}]", User.class);
// 泛型(如 Map<String, User>)
Type type = new TypeReference<Map<String, User>>() {}.getType();
Map<String, User> map = JSON.parseObject(jsonStr, type);
JSONObject / JSONArray 解析
JSONObject obj = JSON.parseObject("{\"id\":1,\"name\":\"test\"}");
String name = obj.getString("name");
int id = obj.getIntValue("id");
JSONArray arr = JSON.parseArray("[1,2,3]");
int first = arr.getIntValue(0);
JSONPath 支持
使用 JSONPath 可以像 XPath 访问 XML 一样快速提取 JSON 中的特定数据。
String json = "{\"store\":{\"book\":[{\"title\":\"Java编程\"},{\"title\":\"Python入门\"}]}}";
Object obj = JSON.parse(json);
// 获取所有书名
List<String> titles = (List<String>) JSONPath.eval(obj, "$.store.book[*].title");
// 获取第一个书名
String firstTitle = (String) JSONPath.eval(obj, "$.store.book[0].title");
JSONB 二进制格式
JSONB 是 Fastjson2 独有的二进制序列化格式,比普通 JSON 更小、解析更快,适用于高性能内部通信。
User user = new User("张三", 30);
byte[] bytes = JSONB.toBytes(user); // 序列化为字节数组
User deserialized = JSONB.parseObject(bytes, User.class); // 反序列化
// 也支持直接与 JSONObject 互转
JSONObject obj = JSONB.parseObject(bytes, JSONObject.class);
常用配置与特性
通过 JSONWriter.Feature 和 JSONReader.Feature 控制序列化/反序列化行为。
// 格式化输出(美化)
String pretty = JSON.toJSONString(user, JSONWriter.Feature.PrettyFormat);
// 输出时按字段顺序排序
String sorted = JSON.toJSONString(user, JSONWriter.Feature.OrderedField);
// 反序列化时允许注释(非标准 JSON)
JSON.parseObject("/*注释*/{\"name\":\"test\"}", User.class, JSONReader.Feature.AllowComment);
字段命名策略
使用 @JSONField 或全局配置来映射不同命名风格(如驼峰、下划线)。
// 全局配置:输出时使用下划线命名
JSON.config(JSONWriter.Feature.FieldBased, JSONWriter.Feature.UseNativeCharset);
// 推荐在 Bean 上使用注解更清晰
public class Order {
@JSONField(name = "order_id")
private Long orderId;
@JSONField(name = "user_name")
private String userName;
}
日期格式化
默认日期格式为 ISO 8601(如 2026-02-07),可通过注解或全局配置修改。
public class Event {
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date occurTime;
}
// 全局配置
JSON.config(JSONWriter.Feature.WriteDateUseDateFormat); // 使用 yyyy-MM-dd HH:mm:ss
JSON.config(JSONWriter.Feature.UseISO8601DateFormat); // 使用 ISO 8601
忽略空值
序列化时跳过值为 null 的字段,减小 JSON 体积。
User user = new User("张三", null); // age = null
// 默认会输出 {"age":null,"name":"张三"}
String json = JSON.toJSONString(user, JSONWriter.Feature.IgnoreNullValues);
System.out.println(json); // {"name":"张三"}
@JSONField 注解详解
@JSONField 可作用于字段、getter/setter,控制序列化/反序列化的各种细节。
public class Product {
// 指定 JSON 中的字段名
@JSONField(name = "product_id")
private Long id;
// 指定日期格式
@JSONField(format = "yyyy/MM/dd")
private Date createTime;
// 序列化时忽略该字段
@JSONField(serialize = false)
private String internalCode;
// 反序列化时忽略该字段
@JSONField(deserialize = false)
private String computedField;
// 指定字段顺序(值越小越靠前)
@JSONField(ordinal = 1)
private String name;
}
实际案例:Web API 交互
在 Spring Boot 控制器中直接使用 Fastjson2 处理请求与响应。
@RestController
public class UserController {
@PostMapping("/user")
public User createUser(@RequestBody String json) {
// 手动反序列化
User user = JSON.parseObject(json, User.class);
// 处理业务...
return user;
}
@GetMapping("/user/{id}")
public String getUser(@PathVariable Long id) {
User user = userService.get(id);
// 手动序列化并返回,可添加特色格式
return JSON.toJSONString(user, JSONWriter.Feature.PrettyFormat);
}
}
建议在 Spring Boot 中替换默认的 Jackson 为 Fastjson2,配置 HttpMessageConverter 即可。
总结与最佳实践
Fastjson2 是一款高成熟度、高性能、安全的 JSON 库,完全值得作为新项目的首选或旧项目的替代。通过合理利用 JSONPath、JSONB、注解配置以及性能优化技巧,可以显著提升开发效率与系统吞吐量。建议从 Fastjson 1.x 尽早迁移,以获得更好的安全性和性能表现。
核心推荐:日常开发使用 JSON.toJSONString / parseObject;内部 RPC 使用 JSONB;复杂查询使用 JSONPath;关注字段命名和日期格式统一,善用 @JSONField 注解。定期关注版本更新,应用最新优化与修复。

