大家好,我是马建仓。
在前后端数据传输交互中,JSON 因其以跨语言,跨前后端的优点常被开发者用来进行数据交换与解析。在 Java 中,主流的 JSON 库有以下三个:
- fastjson:国内阿里巴巴公司所开发的 JSON 库
- Jackson:Spring 默认的 JSON 库
- Gson:谷歌出品的 JSON 库
关于 fastjson 的发展历程也有个有趣的故事。
2010 年,阿里巴巴有个资深的技术专家温绍锦(花名:高铁),他翻遍全网找不到一个好用的 JSON 解析库,便决定在业余时间自己写一个全世界最快的。彼时,阿里巴巴 B2B 平台技术部正在做应用监控系统 Dragoon,也需要一个高性能的 JSON 解析器和带监控功能的连接池。于是乎,这个解析器诞生了,并被命名为 fastjson,迄今为止 fastjson 已成为 Java 程序员常用的国产类库之一。
然而后来, fastjson 却时常被爆出漏洞问题,一度沦为网友的槽点,2020 年 8 月,因在阿里巴巴内网上被挂贴吐槽,fastjson 作者高铁还曾撰文公开回应争议。
为何会频出漏洞?
2019 年至 2020 年间,fastjson 的版本升级中都有关于 AutoType 的升级,或许这就是原因之一。这个功能是在序列化的 JSON 字符串中带上类型信息,在反序列化时,不需要传入类型,实现自动类型识别。
为了全面修复和升级 fastjson,今年 4 月底,温少大佬正式开源了 fastjson v2,不久前,fastjson v2 已获 Gitee 官方推荐。大家可以前往项目地址与大佬直接沟通,同时也可自行测试复现看看 fastjson v2 效果究竟如何。
fastjson v2 的「十年目标」
从项目仓库可知,fastjson v2 是 fastjson 项目的重要升级,性能有了很大提升,目标是为下一个十年提供一个高性能的 JSON 库,两者采用同一套 API。
据作者表述,fastjson v2 已经解决了 fastjson 的 Auto Type RCE 的问题。
今天,我们就来探索一下这个性能升级的 fastjson v2 有何优势,又应该如何使用呢?
性能支持
- 支持 JSON/JSONB 两种协议,JSONPath 是一等公民
- 支持全量解析和部分解析
- 支持 Java 服务端、客户端 Android、大数据场景
- 支持 Kotlin
- 支持 JSON Schema
- 支持 Android 8+ (2.0.11.android)
- 支持 Graal Native-Image (2.0.11.graal)
使用前需要准备
1.搭建测试环境
2.添加对应依赖
双方用户组(GroupId)不一致
fastjson v2 的 GroupId 和 fastjson 1.x 的不一样
fastjson v2 为:com.alibaba.fastjson2
MAVEN 依赖:
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.11</version>
</dependency>
Gradle 依赖:
dependencies {
implementation 'com.alibaba.fastjson2:fastjson2:2.0.11'
}
3.采用其他模块
- fastjson v1 兼容包
如果原来使用 fastjson 1.2.x 版本,可以使用兼容包,兼容包不能保证 100% 兼容
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.11</version>
</dependency>
- fastjson Kotlin 集成模块
如果项目使用 Kotlin,可以使用 fastjson-kotlin 模块,使用方式上采用 kotlin 的特性
- fastjson Extension 扩展模块
如果项目使用 SpringFramework 等框架,可以使用 fastjson-extension 模块
两种操作流程
简单方式
- 将 JSON 解析为 JSONObject
- 将 JSON 解析为 JSONArray
- 将 JSON 解析为 Java 对象
- 将 Java 对象序列化为 JSON
- 使用 JSONObject、JSONArray
- 将 JavaBean 对象序列化为 JSON
进阶方式
使用 JSONB
- 将 JavaBean 对象序列化 JSONB
- 将 JSONB 数据解析为 JavaBean
使用 JSONPath
- 使用 JSONPath 读取部分数据
- 使用 JSONPath 读取部分 byte[]的数据
- 使用 JSONPath 读取部分 byte[]的数据(注意这里使用 ofJSONB 方法)
注意:源代码请点击此处,一键获取源码
fastjson v2 的具体测试效果到底好不好,还得大家自己来试试咯。测试过程产生的疑惑与发现的 Bug,大家可前往项目仓库与作者一对一直接沟通~