棄坑 FastJson,不香了
不點藍字,我們哪來故事?


一、FastJson為何 二、真的很快嗎? 三、FastJson并沒有那么流行 四、棄坑fastjson
最近艿艿和朋友們正在肝一個單體的開源項目:https://github.com/YunaiV/ruoyi-vue-pro
上周末把項目中使用到 FastJSON 的地方,全部替換成 Jackson,涉及到的點有:
使用 JSON 的地方,使用封裝的 JsonUtil 替換 SpringMVC 的消息轉換器,替換成 Jackson 實現(xiàn)的 Spring Data Redis 的對象轉換器,替換成 Jackson 實現(xiàn)的 MyBatis 使用到 JSON TypeHandler 的地方,替換成 Jackson 實現(xiàn)的 和時間序列化相關的,需要稍微注意下,具體可以看看 spring.jackson 配置項 因為 FastJSON 存在一些非標的行為,所以替換之后,還是要回歸下~
另外,沒有考慮使用 GSON 的原因,一方面它最后維護時間是 2019 年,一方面一些開源庫內嵌使用了 Jackson 的特性
記得 Star 關注下噢,胖友們的支持,真的很重要!
一、FastJson為何
首先抄錄一段來自官網(wǎng)的介紹:FastJson是阿里巴巴的開源JSON解析庫,它可以解析JSON格式的字符串,支持將Java Bean序列化為JSON字符串,也可以從JSON字符串反序列化到JavaBean。
FastJson是Java程序員常用到的類庫之一,相信點開這個頁面的你,也肯定是程序員朋友。正如其名,“快”是其主要賣點。

二、真的很快嗎?
沒有調研就沒有發(fā)言權,本著“追求真理”的初心,來一輪簡單的測試。對比對象選擇應用最廣泛的Jackson和Google出品的Gson。測試環(huán)境選擇JDK 8,AMD 3700X,3200MHZ內存。簡化實驗,只測試簡單對象和復雜對象的String轉對象、對象轉String,調用1千萬次的對比結果如下(時間單位是毫秒):

從測試結果看,F(xiàn)astJson確實是最快的,但僅比Jackson快20%左右,Google的Gson是最慢的,差距較大。讀到這里,是不是覺得選擇FastJson肯定沒錯?。∪绻嬖嚬賳枮槭裁催x擇FastJson?因為快!這一個理由就可以把他頂回去了。
這里的調查研究并不是很充分,沒有對內存占用、大文檔的測試。
在現(xiàn)代應用程序中,即使最慢的Gson,也是滿足需求的;解析文檔速度的快慢,并不能作為選型的唯一標準,可能連主要標準都算不上。對IO優(yōu)化,并行處理等優(yōu)化措施,比選用一個更快的庫更有效。
三、FastJson并沒有那么流行
然而,F(xiàn)astJson并沒有那么流行,有一個最直觀的數(shù)據(jù),那就是在Maven的中的引用量,和Jackson和Gson不在一個數(shù)量級,和Jackson強大的家族更沒法比。

難道我用了一個假的流行的國產類庫?在知乎看到了一篇帖子,討論為什么外國友人不喜歡FastJson。結論就是FastJson是個代碼質量不高的國產類庫。完全顛覆了我的認知,因為在我的項目中,是經(jīng)常使用FastJson的,并沒有出現(xiàn)什么Bug,而且這段評論是在2016年寫的。

抱著懷疑的態(tài)度,打開FastJson的地址,看到大家提的Issues。竟然有1283個未解決的Issues。紅框標識出來的,我自己拿去研究下,因為我看到下面還有人提了一樣的問題。

測試代碼如下:

果然,在采用了最新版本的類庫后,如問題描述的,還是有異常。于是就看到了如下的源代碼:

這段代碼有嚴重的邏輯錯誤,這樣錯誤的格式,例如:
“1970-01-01 00:00:00.000000000.000000000”
或者
“1970-01-01 00:00:00.000000000.000000”
也能轉換成功,而一些正確的格式,例如:
““1970-01-01 00:00:00”,““1970-01-01 00:00:00.000”
卻轉換失敗。
結合知乎上網(wǎng)友的點評,我本人也覺得FastJson并沒有那么優(yōu)秀,另一些深入的點評,例如ASM,我的理解并不深,就不做測試了。
四、棄坑fastjson
在我負責的項目中,因為SpringBoot相關的框架中,應用了Jackson,本著“最少依賴”的原則,json解析應用了Jackson。但是很多同事的代碼中,也用了Gson和Fastjson,當然,是沒有嚴格規(guī)范要求的結果。
通過今天的一個小小研究,Jackson的流行,是有著內在的原因的。在我們以后的項目中,主推Jackson,逐漸的淘汰Fastjson。
往期推薦
下方二維碼關注我

技術草根,堅持分享?編程,算法,架構


