Fastjson:Java高效能JSON庫,序列化與反序列化
阿新 • • 發佈:2018-12-10
Fastjson是一個Java語言編寫的高效能功能完善的JSON庫。它採用一種“假定有序快速匹配”的演算法,把JSON Parse的效能提升到極致,是目前Java語言中最快的JSON庫。Fastjson介面簡單易用,已經被廣泛使用在快取序列化、協議互動、Web輸出、Android客戶端等多種應用場景。
主要特點
- 快速:測試結果比其他Java解析器(包括jackson)或databinder更快。
- 強大:支援繫結常用JDK類以及Java Bean class、Collection、Map、Date 或 enum。
- 除JDK以外不依賴其他第三方庫。
- 遵循Apache 2.0開源協議釋出。
基準測試
測試結果,時間單位為納秒,size大小為位元組。
create ser +same deser +shal +deep total size +dfl kryo 119 1335 1273 1562 1709 1689 3024 223 140 java-manual 119 2129 2055 1005 1031 1062 3191 255 147 json/fastjson/databind 117 1809 1687 1741 1786 1907 3715 486 262 msgpack 117 1827 1582 1985 2020 2118 3945 233 146 json/jackson/manual 118 1672 1501 2235 2232 2365 4037 468 253 protobuf 227 2939 1362 1626 1661 1965 4904 239 149 thrift 242 3157 2898 2031 2116 2194 5351 349 197 json/jackson/databind 119 2851 2726 3941 4008 4154 7005 485 261 hessian 117 6135 5513 10082 10204 10311 16446 501 313 json/google-gson/databind 117 11309 11304 7913 7967 8076 19385 486 259 json/json-lib-databind 119 45547 45114 145951 145866 146582 192129
結果說明:
- create:建立物件(使用序列化工具指定的類)。
- ser:建立物件並序列化。
- +same:序列化相同的物件(例如,不包括建立時間)
- deser:反序列化物件。
- +shal:反序列化物件並訪問頂層欄位。
- +deep:反序列化物件並訪問所有欄位。
- total:建立 + 序列化 + 反序列化 並訪問所有欄位。
- size:序列化後資料大小。
- +dfl:使用Java自帶DEFLATE(zilib)方法壓縮後的序列化資料大小。
FAQ
1. 怎麼獲得fastjson?
你可以通過如下地方下載fastjson:
- maven中央倉庫: http://central.maven.org/maven2/com/alibaba/fastjson/
- Sourceforge.net : https://sourceforge.net/projects/fastjson/files/
- 在maven中如何配置fastjson依賴 fastjson最新版本都會發布到maven中央倉庫,你可以直接依賴。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>x.x.x</version>
</dependency>
2. fastjson主要的API哪些?
fastjson入口類是com.alibaba.fastjson.JSON,主要的API是JSON.toJSONString 和 parseObject。
package com.alibaba.fastjson;
public abstract class JSON {
public static final String toJSONString(Object object);
public static final <T> T parseObject(String text, Class<T> clazz, Feature... features);
}
序列化:
String jsonString = JSON.toJSONString(obj);
反序列化:
VO vo = JSON.parseObject("...", VO.class);
泛型反序列化:
import com.alibaba.fastjson.TypeReference;
List<VO> list = JSON.parseObject("...", new TypeReference<List<VO>>() {});
3. 哪裡找fastjson的使用例子
4. fastjson的效能如何?
fastjson是目前java語言中最快的json庫,比自稱最快的jackson速度要快,第三方獨立測試結果看這裡:https://github.com/eishay/jvm-serializers/wiki/Staging-Results 。
自行做效能測試時,關閉迴圈引用檢測的功能。
JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect)
VO vo = JSON.parseObject("...", VO.class, Feature.DisableCircularReferenceDetect)
5. fastjson效能比gson怎樣?
6. fastjson可以執行在Android上麼?
7. fastjson序列化的需要像json-lib一樣配置Java bean的序列化麼?
不需要,fastjson的序列化和反序列化都不需要做特別配置,唯一的要求是,你序列化的類符合java bean規範。
8. fastjson如何處理日期
fastjson處理日期的API很簡單,例如:
JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss.SSS")
使用ISO-8601日期格式
JSON.toJSONString(obj, SerializerFeature.UseISO8601DateFormat);
全域性修改日期格式
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
反序列化能夠自動識別如下日期格式:
- ISO-8601日期格式
- yyyy-MM-dd
- yyyy-MM-dd HH:mm:ss
- yyyy-MM-dd HH:mm:ss.SSS
- 毫秒數字
- 毫秒數字字串
- .NET JSON日期格式
- new Date(198293238)
9. 如何定製序列化?
10. 當物件存在引用時,序列化後的結果瀏覽器不支援,怎麼辦?
使用SerializerFeature.DisableCircularReferenceDetect特性關閉引用檢測和生成。例如:
String jsonString = JSON.toJSONString(obj,
SerializerFeature.DisableCircularReferenceDetect
);
11. IE 6不支援JSON帶中文字串,要怎麼處理?
fastjson提供了BrowserCompatible這個配置,開啟之後,所有的中文都會序列化為\uXXXX這種格式,位元組數會多一些,但是能相容IE 6。
String jsonString = JSON.toJSONString(obj,
SerializerFeature.BrowserCompatible
);