javascript
两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)
本篇文章主要介紹了"兩款JSON類庫Jackson與JSON-lib的性能對比(新增第三款測試)",主要涉及到兩款JSON類庫Jackson與JSON-lib的性能對比(新增第三款測試)方面的內(nèi)容,對于兩款JSON類庫Jackson與JSON-lib的性能對比(新增第三款測試)感興趣的同學(xué)可以參考一下。
近日做一些性能優(yōu)化工作,在挑選JSON類庫時,發(fā)現(xiàn)除了一般常用的JSON-lib外,還有一款號稱性能最快的JSON處理器Jackson,于是用上了剛學(xué)會的JMeter,對這兩個類庫進行了簡單的性能對比。
?
Jackson:http://jackson.codehaus.org/
JSON-lib:http://json-lib.sourceforge.net/
Gson:http://code.google.com/p/google-gson/
?
測試環(huán)境:
?
1、工作電腦:Intel雙核E8400 共6GHz,內(nèi)存4GB,WinXP
2、JSON-lib用最新的JDK15,GSON版本是最新的v1.4,Jackson也是最新的v1.5.5,JDK-v1.6.0_20,JMeter-v2.4
3、測試時不開啟任何無關(guān)進程,每完成一項測試后關(guān)閉JMeter整理內(nèi)存后,再進行下一項測試,每項測試運行3次,取平均值
4、JSON轉(zhuǎn)Java Bean意為將JSON格式轉(zhuǎn)換成Java類,這個類內(nèi)包括Map、List、Date、Integer/Long/Double、String等類型的屬性,Java Bean轉(zhuǎn)Json則同理。另外,兩者互轉(zhuǎn),每次轉(zhuǎn)換的數(shù)據(jù)都是隨機生成
?
測試結(jié)果:
?
* 吞吐量的值越大越好,總耗時的值越小越好
?
JSON轉(zhuǎn)Bean,5個線程并發(fā),約200字節(jié)對象,1千萬次轉(zhuǎn)換:
?
| ? | Jackson | JSON-lib | Gson |
| TPS | 64113.7 | 8067.4 | 13952.8 |
| 總耗時(秒) | 155 | 1238 | 700 |
?
Bean轉(zhuǎn)JSON,5個線程并發(fā),約200字節(jié)對象,1千萬次轉(zhuǎn)換:
?
?
| ? | Jackson | JSON-lib | Gson |
| TPS | 54802 | 15093.2 | 17308.2 |
| 總耗時(秒) | 181 | 661 | 560 |
?
JSON轉(zhuǎn)Bean,5個線程并發(fā),約2K對象,1千萬次轉(zhuǎn)換:
?
| ? | Jackson | JSON-lib | Gson |
| TPS | 37314 | 2406.9 | 3657.50 |
| 總耗時(秒) | 267 | 4120 | 2720 |
?
Bean轉(zhuǎn)JSON,5個線程并發(fā),約2K對象,1千萬次轉(zhuǎn)換:
?
| ? | Jackson | JSON-lib | Gson |
| TPS | 30922.2 | 4274.8 | 4977.00 |
| 總耗時(秒) | 322 | 2320 | 2000 |
?
測試總結(jié):
?
1、顯而易見,無論是哪種形式的轉(zhuǎn)換,Jackson > Gson > Json-lib。
?????Jackson的處理能力甚至高出Json-lib有10倍左右
2、JSON-lib似乎已經(jīng)停止更新,最新的版本也是基于JDK15,而Jackson的社區(qū)則較為活躍;
3、在測試性能的同時,又以人肉方式對這三個類庫轉(zhuǎn)換的正確性?進行了檢查?,三者均達(dá)100%正確?;
4、JSON-lib在轉(zhuǎn)換諸如Date類型時較為累贅,如以下是兩者的轉(zhuǎn)換結(jié)果:
JSON-lib:
{"brithday":{"date":17,"day":2,"hours":9,"minutes":24,"month":7,"seconds":26,"time":1282008266398,"timezoneOffset":-480,"year":110}}
Jackson:
{"brithday":1282008123101}
5、JSON-lib依賴commons系列的包及?ezmorph包共?5個,而Jackson除自身的以外只依賴于commons-logging?
6、Jackson提供完整基于節(jié)點的Tree Model,以及完整的OJM數(shù)據(jù)綁定功能。
?
Jackson使用示例:
?
JacksonMapper:
創(chuàng)建為餓漢式單例模式?,Jackson用于轉(zhuǎn)換的核心類ObjectMapper無需每次都new一個object,官網(wǎng)上的一句話:can reuse, share globally
?
Java代碼???
JSON轉(zhuǎn)Bean:
?
Java代碼???
Bean轉(zhuǎn)JSON:
?
Java代碼???
* 上面兩段代碼中的YourBean當(dāng)然也可以是Java的基本類型
?
?
?
?
?
?
?
近日做一些性能優(yōu)化工作,在挑選JSON類庫時,發(fā)現(xiàn)除了一般常用的JSON-lib外,還有一款號稱性能最快的JSON處理器Jackson,于是用上了剛學(xué)會的JMeter,對這兩個類庫進行了簡單的性能對比。
?
Jackson:http://jackson.codehaus.org/
JSON-lib:http://json-lib.sourceforge.net/
Gson:http://code.google.com/p/google-gson/
?
測試環(huán)境:
?
1、工作電腦:Intel雙核E8400 共6GHz,內(nèi)存4GB,WinXP
2、JSON-lib用最新的JDK15,GSON版本是最新的v1.4,Jackson也是最新的v1.5.5,JDK-v1.6.0_20,JMeter-v2.4
3、測試時不開啟任何無關(guān)進程,每完成一項測試后關(guān)閉JMeter整理內(nèi)存后,再進行下一項測試,每項測試運行3次,取平均值
4、JSON轉(zhuǎn)Java Bean意為將JSON格式轉(zhuǎn)換成Java類,這個類內(nèi)包括Map、List、Date、Integer/Long/Double、String等類型的屬性,Java Bean轉(zhuǎn)Json則同理。另外,兩者互轉(zhuǎn),每次轉(zhuǎn)換的數(shù)據(jù)都是隨機生成
?
測試結(jié)果:
?
* 吞吐量的值越大越好,總耗時的值越小越好
?
JSON轉(zhuǎn)Bean,5個線程并發(fā),約200字節(jié)對象,1千萬次轉(zhuǎn)換:
?
| ? | Jackson | JSON-lib | Gson |
| TPS | 64113.7 | 8067.4 | 13952.8 |
| 總耗時(秒) | 155 | 1238 | 700 |
?
?
Bean轉(zhuǎn)JSON,5個線程并發(fā),約200字節(jié)對象,1千萬次轉(zhuǎn)換:
?
| ? | Jackson | JSON-lib | Gson |
| TPS | 54802 | 15093.2 | 17308.2 |
| 總耗時(秒) | 181 | 661 | 560 |
?
?
JSON轉(zhuǎn)Bean,5個線程并發(fā),約2K對象,1千萬次轉(zhuǎn)換:
?
| ? | Jackson | JSON-lib | Gson |
| TPS | 37314 | 2406.9 | 3657.50 |
| 總耗時(秒) | 267 | 4120 | 2720 |
?
?
Bean轉(zhuǎn)JSON,5個線程并發(fā),約2K對象,1千萬次轉(zhuǎn)換:
?
| ? | Jackson | JSON-lib | Gson |
| TPS | 30922.2 | 4274.8 | 4977.00 |
| 總耗時(秒) | 322 | 2320 | 2000 |
?
?
測試總結(jié):
?
1、顯而易見,無論是哪種形式的轉(zhuǎn)換,Jackson > Gson > Json-lib。
?????Jackson的處理能力甚至高出Json-lib有10倍左右
2、JSON-lib似乎已經(jīng)停止更新,最新的版本也是基于JDK15,而Jackson的社區(qū)則較為活躍;
3、在測試性能的同時,又以人肉方式對這三個類庫轉(zhuǎn)換的正確性?進行了檢查?,三者均達(dá)100%正確?;
4、JSON-lib在轉(zhuǎn)換諸如Date類型時較為累贅,如以下是兩者的轉(zhuǎn)換結(jié)果:
JSON-lib:
{"brithday":{"date":17,"day":2,"hours":9,"minutes":24,"month":7,"seconds":26,"time":1282008266398,"timezoneOffset":-480,"year":110}}
Jackson:
{"brithday":1282008123101}
5、JSON-lib依賴commons系列的包及ezmorph包共5個,而Jackson除自身的以外只依賴于commons-logging
6、Jackson提供完整基于節(jié)點的Tree Model,以及完整的OJM數(shù)據(jù)綁定功能。
?
Jackson使用示例:
?
JacksonMapper:
創(chuàng)建為餓漢式單例模式?,Jackson用于轉(zhuǎn)換的核心類ObjectMapper無需每次都new一個object,官網(wǎng)上的一句話:can reuse, share globally
Java代碼JSON轉(zhuǎn)Bean:
Java代碼?
Bean轉(zhuǎn)JSON:
Java代碼?
* 上面兩段代碼中的YourBean當(dāng)然也可以是Java的基本類型
?
文章不足之處歡迎大家留言指正:)
?
?
?
11 樓?wangym?2010-08-18???引用 wangliang_5290 寫道 wangym 寫道 wangliang_5290 寫道 我碰到一個問題,要將字符串String json = "{a:1, b:2}";
轉(zhuǎn)化為 Map, 如果用Jackson的話,對字符串格式有嚴(yán)格要求,必須為
String json = "{\"a\":1, \"b\":2}";
否則報錯,覺得不爽。
不知道是對Json了解不夠呢, 還是Jackson就是這么要求的?
在JAVA里定義這樣一個String自然是需要"\"給后面的引號進行轉(zhuǎn)義,無論是用哪個JSON類庫都一樣,但在實際應(yīng)用中,沒有這個問題。
實際應(yīng)用中json串不一定是在java中定義的,有可能是從頁面?zhèn)鬟^來的,java只是負(fù)責(zé)解析。我以前用的是json-lib沒有問題, 但是換成jackson后出現(xiàn)這個問題。不知道是不是對jackson的API研究不夠?
1.json-lib 以下寫法沒有問題
Java代碼
2.jackson 以下寫法報異常
Java代碼
Java代碼
不好意思一開始沒明白你的意思
請開啟支持字段名稱不帶引號的轉(zhuǎn)換模式,默認(rèn)是關(guān)閉的.
即將上面報異常的那句改成這樣: Java代碼
?
24 樓?wangym?2011-01-18???引用 JSON轉(zhuǎn)POJO時,若JSON中的某個字段在POJO中未定義,在默認(rèn)情況下會拋異常轉(zhuǎn)換失敗,只要增加這個配置:? Java代碼
就可以轉(zhuǎn)換正常,即只轉(zhuǎn)換定義的字段,未定義的字段忽略。
轉(zhuǎn)載于:https://www.cnblogs.com/xujishou/p/6929802.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: libcurl实现解析(3) - lib
- 下一篇: shiro real的理解,密码匹配等