四大流行Java JSON庫的終極比較:JSON.simple vs. GSON vs. Jackson vs.JSONP
譯文【51CTO.com快譯】如今,JSON已經(jīng)是公認(rèn)的、服務(wù)器與Web應(yīng)用之間數(shù)據(jù)傳輸?shù)腁PI標(biāo)準(zhǔn)。它通過各種代碼庫,可以在Hadoop或Spark集群中,方便那些基于微服務(wù)和分布式架構(gòu)的數(shù)據(jù)處理應(yīng)用程序,傳輸和解析不同類型與大小的文件。不過,并非所有的JSON庫都會(huì)執(zhí)行相同的操作方式。在高吞吐量的環(huán)境中,一旦出現(xiàn)了快速、連續(xù)、大量的小文件,它們的解析速度就會(huì)出現(xiàn)巨大的差別。
可見,為自己的應(yīng)用環(huán)境選擇合適的代碼庫,往往是至關(guān)重要的。為此,我準(zhǔn)備了一系列基準(zhǔn)性的測試,將和您討論目前四種最為流行的Java JSON庫--JSON.simple、GSON、Jackson、以及JSONP,在解析不同文件大小時(shí)的速度,以方便您能夠做出明智的選擇。
四大JSON庫簡介
由于這四種代碼庫都時(shí)常被廣泛地用于Java環(huán)境的JSON處理過程,因此我們根據(jù)它們?cè)贕ithub項(xiàng)目中的受歡迎程度,進(jìn)行逐一介紹:
- Yidong Fang的JSON.simple:是一個(gè)可用于編、解碼的JSON文本類Java工具包。它旨在成為一個(gè)簡單、輕量級(jí)、且能夠高速運(yùn)行的代碼庫。
- Google的GSON:是一個(gè)能夠?qū)崿F(xiàn)Java對(duì)象與JSON格式相互轉(zhuǎn)換的Java代碼庫。由于提供了對(duì)于Java泛型的完全支持,因此您既不需要對(duì)自己的類進(jìn)行注釋,又能夠簡化對(duì)于特權(quán)源代碼的訪問。
- FasterXML的Jackson項(xiàng)目:是一組帶有流式JSON解析器和生成器庫的處理工具。雖然它是針對(duì)Java設(shè)計(jì)的,但是它可以處理其他非JSON類的編碼。根據(jù)Github使用情況的調(diào)查結(jié)果,它目前是最受歡迎的JSON解析器之一。
- Oracle的JSONP:JSON Processing是以Java API的形式,通過消費(fèi)(consuming)和生成(producing)流式JSON文本,來提供對(duì)于JSON的處理。它屬于開源參考JSR353的實(shí)現(xiàn)。
基準(zhǔn):2017
我們根據(jù)不同文件大小的處理需求,在不同的庫環(huán)境中,測試性地解析了不同大小的文件。總的說來,我們將基準(zhǔn)測試分為兩個(gè)關(guān)鍵場景:
- 從https://github.com/zeMirco/sf-city-lots-json處獲取190 MB的大文件,并測試其解析速度。
- 從http://www.json-generator.com/處隨機(jī)生成1 KB的小文件,并測試其解析速度。
無論是大文件,還是小文件,我們讓每個(gè)庫都對(duì)每個(gè)文件運(yùn)行10次。其中,對(duì)于大文件而言,每個(gè)庫的每一次運(yùn)行時(shí),都會(huì)進(jìn)行10次迭代;而對(duì)于小文件,它們會(huì)每次運(yùn)行10,000次迭代。而且在小文件的測試中,我們不會(huì)在迭代的間隙中,將文件保留在內(nèi)存里,而是直接在AWS上的c3.large實(shí)例中運(yùn)行測試。
下圖完整地顯示了大文件的解析結(jié)果。為了節(jié)省空間,我對(duì)小文件的解析結(jié)果進(jìn)行了平均。如果您想查看擴(kuò)展的結(jié)果,請(qǐng)參見--https://docs.google.com/spreadsheets/d/1iOSAkqRwGGbLHRkcKSyHwpOWYdSrkuQKyUIZ6ef7N-I/edit?usp=sharing。而如果您想查看小文件或庫的源代碼,則請(qǐng)參見--https://github.com/terencetaih/aws-speed。
大文件結(jié)果:2017
從上表中,我們可以看出Jackson或JSON.simple在處理大文件上用時(shí)最少,而且Jackson在總體上會(huì)領(lǐng)先于JSON.simple。通過查看所有測試的平均運(yùn)行結(jié)果可知,Jackson和JSON.simple遙遙領(lǐng)先,JSONP名列第三,GSON排在最后。下面,讓我們以Jackson為基準(zhǔn),用百分比來表示各個(gè)JSON庫的解析速度:
小文件結(jié)果:2017
上表顯示了每個(gè)文件被運(yùn)行10次的平均值,最下面一行是總的平均值。各個(gè)庫所獲得的文件數(shù)量分別為:
- GSON - 14
- JSONP - 5
- Jackson – 1
- JSON.simple – 0
由所有文件的平均測試結(jié)果可知:
- GSON是其中的贏家。
- 盡管在任何單個(gè)文件上都不是最快的,但是JSON.simple在總體上名列第二。
- 盡管在少數(shù)文件上能夠達(dá)到最快,但是JSONP在總體上仍排名第三。
- 雖然Jackson在所有文件解析中都表現(xiàn)得非常一致,但是與其他三個(gè)庫相比,Jackson的運(yùn)行速度是最慢的。
讓我們同樣以GSON為基準(zhǔn),用百分比來表示各個(gè)JSON庫的解析速度:
結(jié)論:2017
在選擇JSON庫時(shí),解析速度雖然并非唯一的考慮因素,但它的確是一個(gè)重要的參考指標(biāo)。在運(yùn)行上述基準(zhǔn)測試時(shí),我們發(fā)現(xiàn)沒有一個(gè)庫可以在所有文件大小、以及所有解析速度上,同時(shí)能夠擊敗其他庫。在大文件解析上表現(xiàn)最好的庫,反而對(duì)小文件的表現(xiàn)并不佳,反之亦然。
因此,我們可以參照如下環(huán)境特征,根據(jù)各自的解析速度優(yōu)勢,選擇合適的JSON庫。
- 如果您的環(huán)境需要經(jīng)?;蛑饕幚泶笮偷腏SON文件,那么Jackson可以成為您的首選庫,而GSON在處理此類大文件時(shí)會(huì)非常費(fèi)勁。
- 如果您的環(huán)境主要處理大量的小型JSON請(qǐng)求,例如需要在微服務(wù)、或分布式架構(gòu)中進(jìn)行各種設(shè)置的話,那么GSON可以成為您的首選庫,而Jackson在處理小文件方面會(huì)比較費(fèi)勁。
- 如果您的環(huán)境不得不經(jīng)常處理大小不同的文件,那么由于JSON.simple在上述兩類測試中都排在第二位,因此可以成為適用于可變環(huán)境的實(shí)用工具(畢竟Jackson和GSON在不同文件大小上的表現(xiàn)各有利弊)。
JSONP在任何情況下,與其他三種JSON庫相比,對(duì)于各種文件的解析速度性能都比較差,因此不太值得推薦。當(dāng)然,據(jù)報(bào)道Java 9正在獲得JSON的原生實(shí)現(xiàn),那么我們可以預(yù)見到它將會(huì)在參考實(shí)現(xiàn)方面,有所改進(jìn)。
基準(zhǔn):2021
下面,我們將使用最新的JSON庫,并在Java 11上再次運(yùn)行相同的基準(zhǔn)測試??傮w而言,它們會(huì)在性能上,比我們之前運(yùn)行的基準(zhǔn)測試,出現(xiàn)顯著的提高。
大文件結(jié)果:2021
如上表所示,本輪基準(zhǔn)測試的贏家是GSON,JSONP緊隨其后,接著是Jackson,最后才是JSON.simple。那么,讓我們以GSON為基準(zhǔn),用百分比來表示各個(gè)JSON庫的解析速度:
小文件結(jié)果:2021
上表顯示了小文件的測試結(jié)果,Gson以明顯的速度優(yōu)勢,再次擊敗了其他三個(gè)JSON庫,蟬聯(lián)冠軍。JSONP緊隨其后,接著是JSON.simple,最后才是Jackson。
由表可知,Gson處理這些文件的速度比第二名快了近200多毫秒。
結(jié)論:2021
通過上述兩大類測試與比較,我們不難發(fā)現(xiàn),無論是Java本身,還是各個(gè)JSON庫,都在速度上提升了不少。其中,GSON的進(jìn)步最為明顯,并且能夠最終在大文件和小文件,兩類基準(zhǔn)測試中脫穎而出。
原文標(biāo)題:The UltimateJSONLibrary:JSON.simple vs. GSON vs. Jackson vs.JSONP,作者:Nick Andrews
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】