1. 程式人生 > >幾種常用JSON庫效能比較

幾種常用JSON庫效能比較

JSON不管是在Web開發還是伺服器開發中是相當常見的資料傳輸格式,一般情況我們對於JSON解析構造的效能並不需要過於關心,除非是在效能要求比較高的系統。
目前對於Java開源的JSON類庫有很多種,下面我們取三個常用的JSON庫進行效能測試對比,同時根據測試結果分析如果根據實際應用場景選擇最合適的JSON庫。
四個JSON類庫分別為:Gson,FastJson,Jackson,Json-lib。
簡單介紹下四個類庫的身份背景。

  • Gson(專案地址:https://github.com/google/gson)。Gson是目前功能最全的Json解析神器,Gson當初是為因應Google公司內部需求而由Google自行研發而來,但自從在2008年五月公開發布第一版後已被許多公司或使用者應用。Gson的應用主要為toJson與fromJson兩個轉換函式,無依賴,不需要例外額外的jar,能夠直接跑在JDK上。而在使用這種物件轉換之前需先建立好物件的型別以及其成員才能成功的將JSON字串成功轉換成相對應的物件。類裡面只要有get和set方法,Gson完全可以將複雜型別的json到bean或bean到json的轉換,是JSON解析的神器。
  • FastJson(專案地址:https://github.com/alibaba/fastjson)。Fastjson是一個Java語言編寫的高效能的JSON處理器,由阿里巴巴公司開發。無依賴,不需要例外額外的jar,能夠直接跑在JDK上。FastJson在複雜型別的Bean轉換Json上會出現一些問題,可能會出現引用的型別,導致Json轉換出錯,需要制定引用。FastJson採用獨創的演算法,將parse的速度提升到極致,超過所有json庫。
  • Jackson(專案地址:https://github.com/FasterXML/jackson)。相比json-lib框架,Jackson所依賴的jar包較少,簡單易用並且效能也要相對高些。而且Jackson社群相對比較活躍,更新速度也比較快。Jackson對於複雜型別的json轉換bean會出現問題,一些集合Map,List的轉換出現問題。Jackson對於複雜型別的bean轉換Json,轉換的json格式不是標準的Json格式。
  • Json-lib(專案地址:http://json-lib.sourceforge.net/index.html)。json-lib最開始的也是應用最廣泛的json解析工具,json-lib 不好的地方確實是依賴於很多第三方包,包括commons-beanutils.jar,commons-collections-3.2.jar,commons-lang-2.6.jar,commons-logging-1.1.1.jar,ezmorph-1.0.6.jar,對於複雜型別的轉換,json-lib對於json轉換成bean還有缺陷,比如一個類裡面會出現另一個類的list或者map集合,json-lib從json到bean的轉換就會出現問題。json-lib在功能和效能上面都不能滿足現在網際網路化的需求。

選擇一個合適的JSON庫要從多個方面進行考慮:

  1. 字串解析成JSON效能
  2. 字串解析成JavaBean效能
  3. JavaBean構造JSON效能
  4. 集合構造JSON效能
  5. 易用性

對於前四條其實都是從JSON的解析構造效能角度考慮,而最後一條則是考慮易用性,這點對於開發者來說其實也是需要考慮的一個問題,如果該庫的API使用難度大,或者很複雜,那麼不建議使用,畢竟JSON解析的效能差異並不大。下面的測試結果針對四個不同數量級的JSON字串,以及分別測試上面提到的前四條效能,結果如下:
這裡寫圖片描述
Json-lib在資料量在10W時OOM了,記憶體開到1G都不行,所以直接Pass了。
從上面圖表可以看到:

  1. 字串解析成JavaBean:當資料量較少時首選FastJson,資料量較大使用Jackson。但是Jackson無法堆一個物件集合進行解析,只能轉成一個Map集合,這點Gson和FastJson處理的比較好。
  2. 字串解析成JSON:當資料量較少時首選FastJson,資料量較大使用Jackson。
  3. JavaBean構造JSON:當資料量較少時選擇Gson,資料量較大可使用Jackson。
  4. 集合構造JSON:首先Jackson,其次Fastjson。

上面是從效能角度分析四種JSON類庫,從易用性角度來分析的話,FastJson的API設計的最簡單,最方便使用,直接使用JSON的兩個靜態方法即可完成四種操作;而Gson和Jackson都需要new一個物件,雖然這個物件可以複用,但是在實際使用過程中還需要用一個全域性變數來儲存改變數,同時API設計的也不是很好理解,對於FastJson來說複雜的API是因為他支援流式解析,適合對JSON進行大量且複雜的操作,但是實際應用中對於JSON的操作都是簡單的解析成JavaBean,然後JavaBean序列化成JSON字串即可,複雜的操作很少。
下面從我自己實際的應用場景出發,考慮該如何選擇合適的JSON類庫。
應用場景:遊戲伺服器,基本是對客戶端傳送過來的JSON格式字串解析成JavaBean,然後將封裝好的指令轉成JSON字串返回給客戶端,這裡考慮到JavaBean轉成JSON與集合轉成JSON的效能差異,所以直接使用集合進行轉成JSON,避免使用JavaBean。
考慮上述場景適合使用FastJson進行JSON字串解析,Jackson將集合轉成JSON格式字串。
淺嘗輒止,歡迎批評指出。

阿里巴巴-杭州,saas化服務時間機會觸手可及,歡迎投遞簡歷:[email protected],給我們一個認識你的機會,給自己一個實現年初的小目標的機會。

相關推薦

常用JSON效能比較

JSON不管是在Web開發還是伺服器開發中是相當常見的資料傳輸格式,一般情況我們對於JSON解析構造的效能並不需要過於關心,除非是在效能要求比較高的系統。 目前對於Java開源的JSON類庫有很多種,下面我們取三個常用的JSON庫進行效能測試對比,同時根據測試

Day-4 簡談常用函式

一 .為什麼會有庫函式呢? 1.我們每個人在學習程式語言時,在一個程式碼寫完後總是想迫不及待地將某些語句列印在螢幕上。此時我們總是會呼叫到printf()這個函式,它可以輕鬆地幫我們實現預期的功能; 2.在程式設計過程中我們會頻繁地做一些字串拷貝的工作,會呼叫到

常用迴歸演算法的比較

# -*- coding:utf-8 -*- import numpy as np import matplotlib.pyplot as plt import random def text2num(string):     str_list = string

常用數據比較

數據庫管理 bsp 商業 mysql服務器 dep 而且 pos pro 多線程 目前,商品化的數據庫管理系統以關系型數據庫為主導產品,技術比較成熟。面向對象的數據庫管理系統雖然技術先進,數據庫易於開發、維護,但尚未有成熟的產品。國際國內的主導關系型數據庫管理系統有Orac

關於Java集合類中的常用隊列

rac syn text 刪除 style asdasd 新元素 其他 arraylist Java中幾種常用的隊列 阻塞隊列與普通隊列的區別在於,當隊列是空的時,從隊列中獲取元素的操作將會被阻塞,或者當隊列是滿時,往隊列裏添加元素的操作會被阻塞。試圖從空的阻塞隊列中獲取元

java-常用數據的JDBCURL

ron log 矽谷 sqlserver com src 課件 ges cal 以mysql的jdbcUrl為例: 1、對於 Oracle 數據庫連接,采用如下形式: jdbc:oracle:thin:@localhost:1521:sid 2、對於 SQLSer

scikit-learn常用演算法的比較(code)

from sklearn import datasets import numpy as np iris =datasets.load_iris() X = iris.data[:,[2,3]] y = iris.target np.unique(y) #np.unique(y)返回儲

常用Json元件的效能測試

https://www.cnblogs.com/blqw/p/3274229.html   上一篇文章中我已經介紹了JsonBuilder方案的整體思路以及一個版本的雛形程式碼,他現在已經是可以使用的了,但是因為是實時反射的,所以效率並不高。 鑑於幾位博友對Jso

iOS效能檢測之Instrunments - 常用工具簡單介紹

Instrunments: 沒錯,就是這貨,很多人平時開發可能不一定會用到這個,但我要說的是,學會使用它,會讓你加分不少哦 先來一張一覽圖: 兩種方式都行。 2、今天主要介紹一下我常用的3種:Core Animation 、Leaks、Time Profiler

進行前端效能優化常用的方法。

程式碼層面:避免使用css表示式,避免使用高階選擇器,通配選擇器。 快取利用:快取Ajax,使用CDN,使用外部js和css檔案以便快取,新增Expires頭,服務端配置Etag,減少DNS查詢等 請求數量:合併樣式和指令碼,使用css圖片精靈,初始首屏之外的圖片資源

常用在CentOS下的編譯

1操作環境   通過命令檢視作業系統版本資訊: [[email protected] ~]# cat /proc/version Linux version 3.10.0-327.el7.x86_64 ([email protected]) (gcc version 4.8.3

STL中常用容器比較

list支援快速的插入和刪除,但是查詢費時; vector支援快速的查詢,但是插入費時。 map查詢的時間複雜度是對數的,這幾乎是最快的,hash也是對數的。  如果我自己寫,我也會用二叉檢索樹,它在大部分情況下可以保證對數複雜度,最壞情況是常數複雜度,而std::m

現階段常用的認證計費技術比較

一、使用者認證對寬頻接入的意義BRAS(寬頻接入伺服器)是借鑑窄帶接入的成熟運作模式,在資料網路由窄帶向寬頻演進的趨勢下,使寬頻網路可以像窄帶接入一樣運營管理。不像窄帶網路尚需要提供PSTN的接入,寬頻網路通常已具備完整的接入網路(ADSL、Ethernet、HFC),因此B

常用影像比較

一、Landsat Landsat主題成像儀 (TM)是Landsat4和Landsat5 攜帶的感測器,從1982年發射至今,其工作狀態良好,幾乎實現了連續的獲得地球影像。Landsat4和Landsat5每16 天掃瞄同一地區,即其16天覆蓋全球一次。Landsat4,

常用的ajax配合json資料格式向後臺傳送請求以及後臺如何接收資料

一、$.ajax()(無重新整理) jsonp格式:以url形式傳遞拼接資料:http://192.168.1.1/pwc/esb?gn=tx&cz=list&id=1&shzt=5var param = {id:$("#cxsq_xk_id").

#牆裂推薦Boost regex# C,C++11,Boost三regex效能比較

在最近的一個專案中,發現之前的正則匹配模組對於長字串匹配效能損失比較厲害,因此對長字串下的各種正則匹配進行了略微研究並附有例項。本文參考了部落格http://www.cnblogs.com/pmars/archive/2012/10/24/2736831.html(下文稱文

java 中常用數據結構

初學 ble log app 使用 blog list 好的 sort Java中有幾種常用的數據結構,主要分為Collection和map兩個主要接口(接口只提供方法,並不提供實現),而程序中最終使用的數據結構是繼承自這些接口的數據結構類。 一、幾個常用類的區別 1.

常用的空格

idt 而且 根據 筆記本 p s 時也 引用 其中 等等 今天上午把在家寫好的代碼下載到另一個筆記本上,一調試發現,出現的結果和之前不一樣。我用代碼寫好的等腰三角形,在家調試完成沒有任何問 題。在這臺筆記本上顯示成了直角三角形。仔細檢查了下,代碼並沒有發現什麽問

C#中常用的集合的用法

col div tex -c 組成 相同 列表 對象 count 集合:將一推數據類型相同的數據放入到一個容器內,該容器就是數組:內存中開辟的一連串空間。 非泛型集合 ArrayList集合: ArrayList是基於數組實現的,是一個動態數組,其容量能自動 增

SSH免登陸ESXI讓操作更便捷安全(常用工具)

esxi vmware ssh工具 免登陸 授權訪問通常在企業環境中,管理員很少去機房在物理機面前進行操作,大部分管理員喜歡遠程管理主機,這樣既方便又高效。在windows上我們使用遠程桌面,在Linux上則使用SSH來連接。ESXi就是一個以Linux為核心改寫的操作系統,因此ESXi中也保留了SSH