下個十年高性能 JSON 庫來了:fastjson2!

作者 | 磊哥
來源 | Java中文社群(ID:javacn666)
轉(zhuǎn)載請聯(lián)系授權(微信ID:GG_Stone)
fastjson2 是 ?fastjson 項目的重要升級,目標是為下一個十年提供一個高性能的 JSON 庫,同一套 API 支持JSON/JSONB 兩種協(xié)議,JSONPath 是一等公民,支持全量解析和部分解析,支持 Java 服務端、客戶端Android、大數(shù)據(jù)場景。
具體使用
1.添加 fastjson 2 依賴
Maven 依賴配置如下:
??<dependency>
??<groupId>com.alibaba.fastjson2groupId>
??<artifactId>fastjson2artifactId>
??<version>2.0.2version>
??dependency>
2.常用類和方法
package?com.alibaba.fastjson2;
class?JSON?{
????//?將字符串解析成JSONObject
????static?JSONObject?parseObject(String?str);
????//?將字符串解析成JSONArray
????static?JSONArray?parseArray(String?str);
????//?將字符串解析成Java對象
????static?T?parseObject(byte[]?utf8Bytes,?Class?objectClass) ;
????//?將Java對象輸出成字符串
????static?String?toJSONString(Object?object);
????//?將Java對象輸出成UT8編碼的byte[]
????static?byte[]?toJSONBytes(Object?object);
}
class?JSONB?{
????//?將jsonb格式的byte[]解析成Java對象
????static?T?parseObject(byte[]?jsonbBytes,?Class?objectClass) ;
????//?將Java對象輸出成jsonb格式的byte[]
????static?byte[]?toBytes(Object?object);
}
class?JSONObject?{
????Object?get(String?key);
????int?getIntValue(String?key);
????Integer?getInteger(String?key);
????long?getLongValue(String?key);
????Long?getLong(String?key);
????T?getObject(String?key,?Class?objectClass) ;
????//?將JSONObject對象轉(zhuǎn)換為Java對象
????T?toJavaObject(Class?objectClass) ;
}
class?JSONArray?{
????Object?get(int?index);
????int?getIntValue(int?index);
????Integer?getInteger(int?index);
????long?getLongValue(int?index);
????Long?getLong(int?index);
????T?getObject(int?index,?Class?objectClass) ;
}
class?JSONPath?{
????//?構造JSONPath
????static?JSONPath?of(String?path);
????//?根據(jù)path直接解析輸入,會部分解析優(yōu)化,不會全部解析
????Object?extract(JSONReader?jsonReader);
????//?根據(jù)path對對象求值
????Object?eval(Object?rootObject);
}
class?JSONReader?{
????//?構造基于String輸入的JSONReader
????static?JSONReader?of(String?str);
????//?構造基于ut8編碼byte數(shù)組輸入的JSONReader
????static?JSONReader?of(byte[]?utf8Bytes);
????//?構造基于char[]輸入的JSONReader
????static?JSONReader?of(char[]?chars);
????//?構造基于json格式byte數(shù)組輸入的JSONReader
????static?JSONReader?ofJSONB(byte[]?jsonbBytes)
}
3.將字符串轉(zhuǎn)換成對象
JSON 字符串轉(zhuǎn)換成對象:
String?str?=?"{\"id\":123}";
JSONObject?jsonObject?=?JSON.parseObject(str);
int?id?=?jsonObject.getIntValue("id");
JSON 字符串轉(zhuǎn)換成數(shù)組:
String?str?=?"[\"id\",?123]";
JSONArray?jsonArray?=?JSON.parseArray(str);
String?name?=?jsonArray.getString(0);
int?id?=?jsonArray.getIntValue(1);
4.將對象轉(zhuǎn)換成 JSON 字符串
將對象轉(zhuǎn)換成 JSON 字符串:
class?Product?{
????public?int?id;
????public?String?name;
}
Product?product?=?new?Product();
product.id?=?1001;
product.name?=?"DataWorks";
JSON.toJSONString(product);
以上程序執(zhí)行結果如下:
{
????"id"????:?1001,
????"name"????:?"DataWorks"
}
將數(shù)組轉(zhuǎn)換成 JSON 字符串:
JSON.toJSONString(product,?JSONWriter.Feature.BeanToArray);
以上程序執(zhí)行結果如下:
[123,?"DataWorks"]
性能測試報告
fastjson2、fastjson1 和 jackson 使用 JMH (Java Microbenchmark Harness) 在 JDK 8 和 JDK 11 的測試數(shù)據(jù)如下:
以上測試數(shù)據(jù)來自 fastjson 官網(wǎng):https://github.com/alibaba/fastjson2/wiki/fastjson_benchmark
總結
fastjson 2 相比于 fastjson 1 性能大概提升了 200%+,它的目標是成為下一個 10 年的高性能 JSON 操作工具,但如果是老項目將 fastjson 1 升級為 fastjson 2 要慎重一些,因為 fastjson 2 不保證 100% 兼容 fastjson 1。
引用 & 鳴謝
https://github.com/alibaba/fastjson2/releases
https://github.com/alibaba/fastjson2/wiki/fastjson_benchmark
是非審之于己,毀譽聽之于人,得失安之于數(shù)。
公眾號:Java面試真題解析
面試合集:https://gitee.com/mydb/interview

往期推薦

頂級Javaer,常用的 14 個類庫

Spring Boot 中實現(xiàn)跨域的 5 種方式,你一定要知道!

synchronized底層是如何實現(xiàn)的?

