知乎:fastjson 這麼快,為啥老外還是熱衷 jackson?
- 2020 年 3 月 2 日
- 筆記
來源:甘明
dwz.cn/ztVmUvBI
知乎上有人提問:fastjson這麼快,為啥老外還是熱衷 jackson? 下面是甘明的回答,從各個方面分析了這個問題:
哈哈哈,我來回答這個問題!
因為我實在是對這兩個庫太熟悉了。
1、
你寫個bean,然後屬性里分別有包含_(下劃線開頭、#開頭)之類的屬性,序列化為json時,出現屬性丟失,那麼自然你也無法反序列化回來。
這個問題,1.2.14版本以後已經改正。
2、
翻閱fastjson的源碼,你會發現有很多寫死的程式碼,比如:針對spring之類的框架的各種處理,都是用classload判斷是否存在這種類名。
這是什麼意思呢?
意思就是如果你用spring的那種思想,自己寫了個類似的功能,因為你這個項目里沒有spring的那個類,那麼用起來就有一堆bug;當然不僅限於這些,還有很多,比如ASM位元組碼織入部分,看源碼的話,能發現的缺點數不勝數。
3、
其解析json主要是用的String類substring這個方法,所以解析起來非常「快」,因為申請記憶體次數很少。
但是因為jdk1.7之前substring的實現並沒有new一個新對象,在使用的時候,如果解析的json非常多,稍不注意就會出現記憶體泄漏(比如一個40K的json,你在對象里引用了裡邊的一個key,即使這個key只有2位元組,也會導致這40K的json無法被垃圾回收器回收),這也是「快」帶來的負面效果。
而且這還不算,在jdk1.7以上版本對string的substring方法做了改寫,改成了重新new一個string的方式,於是這個「快」的優勢也不存在了。

最後
fastjson就是一個程式碼品質較差的國產類庫,用很多投機取巧的的做法去實現所謂的「快」,而失去了原本應該兼容的java特性,對json標準遵循也不嚴格,自然很難在國際上流行。
json從發明到現在非常流行,並不是因為json快的原因(比json快且小巧的格式和類庫一大把),而是因為json和web結合的時候更易於使用,對開發人員易於理解。
很多人拿fastjson和jackson比,就像拿非智慧機和iphone比待機時間,其功能性不一樣,jackson的很多功能fastjson並沒有實現,所以這種對比也不客觀。
fastjson之所以沒在國際上流行起來,最主要的原因應該是開發者的思路全放到「快」上去了,而偏離了「標準」及功能性,品質也不夠好,有點「捨本逐末」的味道。
當然在目前的環境下,國產軟體能踏實的心態做好開源的不多,fastjson團隊能這麼快的回饋並修正問題,這種精神還是值得稱讚的。希望中國的技術從業者能更重視「技術的原始需求」。
你覺得會是什麼原因?歡迎在留言區討論。
如果你喜歡這篇文章,喜歡,轉發。
生活很美好,明天見(。・ω・。)ノ♡