獨家授權自:開Github中文社區
大家好,我是hub哥,又到了本期分享。這期我們來聊聊Java中解析JSON的三個主流類庫:
FastJSON、Gson和Jackson。
先來看下這三貨在Github上的基本數據:
FastJson
Github地址:
https://github.com/alibaba/fastjson
Jackson
Github地址:
https://github.com/FasterXML/jackson
Gson
Github地址:
https://github.com/google/gson
碼友們對這三貨各方面也一直爭議不斷,大多關心的,還是性能以及穩定性。本文主測性能;對於這三個庫的簡介以及用法,就不去廢話了,一個簡單明瞭的測評,直接上!
主要對這三個類庫在JSON序列化和反序列化在速度方面的表現做一些測評,為了防止由於內存導致測試結果出現偏差,測試中對JVM內存配置-Xmx4g -Xms4g。
測試代碼已經貼到了文章末尾。
JSON序列化(Object => JSON)
測試樣本數量為100000個,為了保證每個類庫在測試中都能處理同一個樣本,先把樣本Java對象保存在文件中。每個類庫測試5次,每次循環測試10遍,去掉最快速度和最慢速度,對剩下的8遍求平均值作為最終的速度,取5次測試中最好的平均速度作為最終的測試數據。
測試結果:
從測試數據可以看出,Jackson是最快的(耗時比Gson少了大約700毫秒),Gson耗時最久。
JSON反序列化(JSON => Object)
同樣,測試樣本數量為100000個,為了保證每個類庫在測試中都能處理同一個樣本,先把樣本JSON對象保存在文件中。每個類庫測試5次,每次循環測試10遍,去掉最快速度和最慢速度,對剩下的8遍求平均值作為最終的速,取5次測試中最好的平均速度作為最終的測試數據。
測試結果:
從測試數據可以看出,在反序列化上性能 FastJson最快,不過與Jackson差距並不明顯,Gson耗時最久
可見,不管是序列化還是反序列化,速度方面首先陣亡的,是Gson!
那還剩下FastJson和Jackson
FastJson在某些方面確實快一些,但是和Jackson 的差距不大,優勢並沒有太明顯。Jackson還可以加上AfterBurner來使用byte generation,這樣和FastJson的差距就更小了。
除了在反序列化的速度勝出外,FastJson相比較 Jackson 有不少短板,我們可以從以下3方面對比:
1. 可定製性
Jackson有靈活的API,可以很容易進行擴展和定製,而且很多時候需要的模塊都已經有人提供了。比如guava中定義的數據類型,比如kotlin語言Immutable的類型等,比如java8 引入的新日期時間類型和Optional都已經有支持的模塊。
FastJson只有一個(簡陋)的SerializeFilter機制用來定製序列化,ParseProcess機制用來定製反序列化,每次調用序列化/反序列化的的時候都要自己傳filter或者Process這個參數過去,Jackson和 Gson都是直接註冊模塊就可以了,Jackson還可以使用SPI來自動發現和註冊模塊。
2. 代碼質量
公司有一些項目使用了Fastjson,在使用Fastjson的項目裡面曾碰到過的兩個低級bug:
1. 碰到在128~255 的字符直接異常,這些主要是西歐語言的字符,因為他用一個數組來記錄 轉義後的字符表示,但是數組長度只有128...
2. 內存佔用過多。Fastjson為了性能,在ThreadLocal中緩存了char[] buffer,這樣避免分配內存和gc的開銷。但是如果碰到了大的json(比如10M這樣的),就會佔用大量的內存,而且以後都是處理小JSON了內存佔用也回不來。
這些問題雖然後來的版本都修復了,但是也反映出Fastjson代碼質量上要求不夠嚴格。而Jackson這麼多年來使用上還沒有碰到過這樣的Bug.
3. 文檔
相比Jackson, Fastjson英文文檔就顯得比較欠缺,已有的也不規範,這樣就更沒法指望老外用了,相對還是國內開發者佔大多數
這麼來看,最終結果很明顯了:
觀點
JSON從發明到現在之所以流行,並不是因為json快的原因(比json快且小巧的格式和類庫一大把),而是因為json和web結合的時候更易於使用,對開發人員易於理解。很多人拿FastJson和Jackson比,就像拿非智能機和iphone比待機時間,其功能性不一樣,Jackson的很多功能FastJson並沒有實現,所以這種對比也不客觀。FastJson之所以沒在國際上流行起來,最主要的原因應該是開發者的思路全放到“快”上去了,而偏離了“標準”及功能性,質量也不夠好,有點“捨本逐末”的味道。
當然在目前的環境下,國產軟件能踏實的心態做好開源的不多,FastJson團隊能這麼快的反饋並修正問題,這種精神還是值得稱讚的。希望國內的技術從業者能更重視“技術的原始需求”。
測試代碼:
樣本對象包括Boolean、Int、Long、Double、Date、String、List和Map字段,其中List長度和Map的Key數量可以根據需要改變。
開發者技術前線 ,彙集技術前線快訊和關注行業趨勢,大廠乾貨,是開發者經歷和成長的優秀指南。
好文點個在贊吧!