JSON無論是在Web開發仍是服務器開發中是至關常見的數據傳輸格式,通常狀況咱們對於JSON解析構造的性能並不須要過於關心,除非是在性能要求比較高的系統。 目前對於Java開源的JSON類庫有不少種,下面咱們取四個經常使用的JSON庫進行性能測試對比,同時根據測試結果分析若是根據實際應用場景選擇最合適的JSON庫。JSON類庫分別爲:JSONObject、Gson、FastJson和Jackson。 簡單介紹下四個類庫的身份背景。算法
- JSONObject:Android原生提供的Json處理API。其核心是JSONObject和JSONArray兩個類。
- Gson:Gson是目前功能最全的Json解析工具,Gson當初是爲因應Google公司內部需求而由Google自行研發而來。Gson的應用主要爲toJson與fromJson兩個轉換函數。而在使用這種對象轉換以前需先建立好對象的類型以及其成員才能成功的將JSON字符串成功轉換成相對應的對象。Gson徹底能夠將複雜類型的json到bean或bean到json的轉換,是JSON解析的神器。
- FastJson:Fastjson是一個Java語言編寫的高性能的JSON處理器。FastJson在複雜類型的Bean轉換Json上會出現一些問題,可能會出現引用的類型,致使Json轉換出錯,須要制定引用。FastJson採用首創的算法,將parse的速度提高到極致,超過全部json庫。
- Jackson:基於事件驅動,與GSON相同,先建立一個對應於JSON數據的JavaBean類就能夠經過簡單的操做解析出所需JSON數據。但和Gson解析不一樣的是,GSON可按需解析,Jackson沒法按需解析。
選擇一個合適的JSON庫要從多個方面進行考慮:序列化與序列化的耗時及內存的消耗,還有就是代碼操做是否簡單。json
針對這三種Json處理方案,咱們以真實數據進行測試比較:分別使用三種方式進行普通Object類的序列化與反序列化、List類的序列化和反序列化,處理量級分別是十、100、1000和10000的狀況下,比較這些操做的耗時與內存消耗,最終得出結果以下:服務器
List反序列化
List序列化
普通Object反序列化
普通Object序列化
內存消耗
上圖中的數據,都進行了四次實驗並取平均值所得。函數
由上述統計數據得出:工具
- 反序列化操做:整體來講,JSONObject處理速度最優,不管是處理普通Object仍是List集合;
- 反序列化操做:隨着處理量級的增大,Gson庫更加費時;
- 序列化操做:整體依舊是JSONObject處理速度最快,而後是FastJson,Gson,Jackson最差;
- FastJson操做,處理量級對內存消耗影響不大,所耗內存相對較少;
- 進行大量操做時,JSONObject內存消耗明顯增長,高於其餘兩種方式;
- Jackson在序列化和反序列化時耗時都是最長的,內存消耗也是最大的,因此不建議使用Jackson。
綜上,當數據量級不大時,從內存消耗和處理速度考慮,都應首選JSONObject,但JSONObject代碼繁雜,容易出錯,當數據量大時,不建議使用JSONObject,是由於其消耗內存過大,容易引起異常。性能
數據量不大時,Gson與FastJson性能至關,FastJson稍優於Gson,但處理大量數據時,FastJson在內存消耗方面有明顯優點。測試