日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)

發布時間:2023/12/4 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇文章主要介紹了"兩款JSON類庫Jackson與JSON-lib的性能對比(新增第三款測試)",主要涉及到兩款JSON類庫Jackson與JSON-lib的性能對比(新增第三款測試)方面的內容,對于兩款JSON類庫Jackson與JSON-lib的性能對比(新增第三款測試)感興趣的同學可以參考一下。

近日做一些性能優化工作,在挑選JSON類庫時,發現除了一般常用的JSON-lib外,還有一款號稱性能最快的JSON處理器Jackson,于是用上了剛學會的JMeter,對這兩個類庫進行了簡單的性能對比。

?

Jackson:http://jackson.codehaus.org/

JSON-lib:http://json-lib.sourceforge.net/

Gson:http://code.google.com/p/google-gson/

?

測試環境:

?

1、工作電腦:Intel雙核E8400 共6GHz,內存4GB,WinXP

2、JSON-lib用最新的JDK15,GSON版本是最新的v1.4,Jackson也是最新的v1.5.5,JDK-v1.6.0_20,JMeter-v2.4

3、測試時不開啟任何無關進程,每完成一項測試后關閉JMeter整理內存后,再進行下一項測試,每項測試運行3次,取平均值

4、JSON轉Java Bean意為將JSON格式轉換成Java類,這個類內包括Map、List、Date、Integer/Long/Double、String等類型的屬性,Java Bean轉Json則同理。另外,兩者互轉,每次轉換的數據都是隨機生成

?

測試結果:

?

* 吞吐量的值越大越好,總耗時的值越小越好

?

JSON轉Bean,5個線程并發,約200字節對象,1千萬次轉換:

?

?JacksonJSON-libGson
TPS64113.78067.413952.8
總耗時(秒)1551238700

?

Bean轉JSON,5個線程并發,約200字節對象,1千萬次轉換:

?

?

?JacksonJSON-libGson
TPS5480215093.217308.2
總耗時(秒)181661560

?

JSON轉Bean,5個線程并發,約2K對象,1千萬次轉換:

?

?JacksonJSON-libGson
TPS373142406.93657.50
總耗時(秒)26741202720

?

Bean轉JSON,5個線程并發,約2K對象,1千萬次轉換:

?

?JacksonJSON-libGson
TPS30922.24274.84977.00
總耗時(秒)32223202000

?

測試總結:

?

1、顯而易見,無論是哪種形式的轉換,Jackson > Gson > Json-lib。

?????Jackson的處理能力甚至高出Json-lib有10倍左右

2、JSON-lib似乎已經停止更新,最新的版本也是基于JDK15,而Jackson的社區則較為活躍;

3、在測試性能的同時,又以人肉方式對這三個類庫轉換的正確性?進行了檢查?,三者均達100%正確?

4、JSON-lib在轉換諸如Date類型時較為累贅,如以下是兩者的轉換結果:

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提供完整基于節點的Tree Model,以及完整的OJM數據綁定功能。

?

Jackson使用示例:

?

JacksonMapper:

創建為餓漢式單例模式?,Jackson用于轉換的核心類ObjectMapper無需每次都new一個object,官網上的一句話:can reuse, share globally

?

Java代碼??
  • /**?
  • ?*?@author?xuanyin?
  • ?*??
  • ?*/??
  • public?class?JacksonMapper?{??
  • ??
  • ????/**?
  • ?????*??
  • ?????*/??
  • ????private?static?final?ObjectMapper?mapper?=?new?ObjectMapper();??
  • ??
  • ????/**?
  • ?????*??
  • ?????*/??
  • ????private?JacksonMapper()?{??
  • ??
  • ????}??
  • ??
  • ????/**?
  • ?????*??
  • ?????*?@return?
  • ?????*/??
  • ????public?static?ObjectMapper?getInstance()?{??
  • ??
  • ????????return?mapper;??
  • ????}??
  • ??
  • }??
  • ?

    JSON轉Bean:

    ?

    Java代碼??
  • ......??
  • String?json?=?"...";??
  • ObjectMapper?mapper?=?JacksonMapper.getInstance();??
  • YourBean?bean?=?mapper.readValue(json,?new?YourBean().getClass());??
  • ......??
  • ?

    Bean轉JSON:

    ?

    Java代碼??
  • ......??
  • YourBean?bean?=?new?YourBean();??
  • ......??
  • ObjectMapper?mapper?=?JacksonMapper.getInstance();??
  • StringWriter?sw?=?new?StringWriter();??
  • JsonGenerator?gen?=?new?JsonFactory().createJsonGenerator(sw);??
  • mapper.writeValue(gen,?bean);??
  • gen.close();??
  • String?json?=?sw.toString();??
  • ......??
  • ?

    * 上面兩段代碼中的YourBean當然也可以是Java的基本類型

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    近日做一些性能優化工作,在挑選JSON類庫時,發現除了一般常用的JSON-lib外,還有一款號稱性能最快的JSON處理器Jackson,于是用上了剛學會的JMeter,對這兩個類庫進行了簡單的性能對比。

    ?

    Jackson:http://jackson.codehaus.org/

    JSON-lib:http://json-lib.sourceforge.net/

    Gson:http://code.google.com/p/google-gson/

    ?

    測試環境:

    ?

    1、工作電腦:Intel雙核E8400 共6GHz,內存4GB,WinXP

    2、JSON-lib用最新的JDK15,GSON版本是最新的v1.4,Jackson也是最新的v1.5.5,JDK-v1.6.0_20,JMeter-v2.4

    3、測試時不開啟任何無關進程,每完成一項測試后關閉JMeter整理內存后,再進行下一項測試,每項測試運行3次,取平均值

    4、JSON轉Java Bean意為將JSON格式轉換成Java類,這個類內包括Map、List、Date、Integer/Long/Double、String等類型的屬性,Java Bean轉Json則同理。另外,兩者互轉,每次轉換的數據都是隨機生成

    ?

    測試結果:

    ?

    * 吞吐量的值越大越好,總耗時的值越小越好

    ?

    JSON轉Bean,5個線程并發,約200字節對象,1千萬次轉換:

    ?

    ?JacksonJSON-libGson
    TPS64113.78067.413952.8
    總耗時(秒)1551238700

    ?

    ?

    Bean轉JSON,5個線程并發,約200字節對象,1千萬次轉換:

    ?

    ?JacksonJSON-libGson
    TPS5480215093.217308.2
    總耗時(秒)181661560

    ?

    ?

    JSON轉Bean,5個線程并發,約2K對象,1千萬次轉換:

    ?

    ?JacksonJSON-libGson
    TPS373142406.93657.50
    總耗時(秒)26741202720

    ?

    ?

    Bean轉JSON,5個線程并發,約2K對象,1千萬次轉換:

    ?

    ?JacksonJSON-libGson
    TPS30922.24274.84977.00
    總耗時(秒)32223202000

    ?

    ?

    測試總結:

    ?

    1、顯而易見,無論是哪種形式的轉換,Jackson > Gson > Json-lib。

    ?????Jackson的處理能力甚至高出Json-lib有10倍左右

    2、JSON-lib似乎已經停止更新,最新的版本也是基于JDK15,而Jackson的社區則較為活躍;

    3、在測試性能的同時,又以人肉方式對這三個類庫轉換的正確性?進行了檢查?,三者均達100%正確?

    4、JSON-lib在轉換諸如Date類型時較為累贅,如以下是兩者的轉換結果:

    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提供完整基于節點的Tree Model,以及完整的OJM數據綁定功能。

    ?

    Jackson使用示例:

    ?

    JacksonMapper:

    創建為餓漢式單例模式?,Jackson用于轉換的核心類ObjectMapper無需每次都new一個object,官網上的一句話:can reuse, share globally

    Java代碼
  • /**??
  • ?*?@author?xuanyin??
  • ?*???
  • ?*/??
  • public?class?JacksonMapper?{ ??
  • ??
  • ????/**??
  • ?????*???
  • ?????*/??
  • ????private?static?final?ObjectMapper?mapper?=?new?ObjectMapper(); ??
  • ??
  • ????/**??
  • ?????*???
  • ?????*/??
  • ????private?JacksonMapper()?{ ??
  • ??
  • ????} ??
  • ??
  • ????/**??
  • ?????*???
  • ?????*?@return??
  • ?????*/??
  • ????public?static?ObjectMapper?getInstance()?{ ??
  • ??
  • ????????return?mapper; ??
  • ????} ??
  • ??
  • }???
  • JSON轉Bean:

    Java代碼
  • ...... ??
  • String?json?=?"..."; ??
  • ObjectMapper?mapper?=?JacksonMapper.getInstance(); ??
  • YourBean?bean?=?mapper.readValue(json,?new?YourBean().getClass()); ??
  • ......??
  • ?

    Bean轉JSON:

    Java代碼
  • ...... ??
  • YourBean?bean?=?new?YourBean(); ??
  • ...... ??
  • ObjectMapper?mapper?=?JacksonMapper.getInstance(); ??
  • StringWriter?sw?=?new?StringWriter(); ??
  • JsonGenerator?gen?=?new?JsonFactory().createJsonGenerator(sw); ??
  • mapper.writeValue(gen,?bean); ??
  • gen.close(); ??
  • String?json?=?sw.toString(); ??
  • ......??
  • ?

    * 上面兩段代碼中的YourBean當然也可以是Java的基本類型

    ?

    文章不足之處歡迎大家留言指正:)

    ?

    ?

    ?

    11 樓?wangym?2010-08-18???引用 wangliang_5290 寫道 wangym 寫道 wangliang_5290 寫道 我碰到一個問題,要將字符串
    String json = "{a:1, b:2}";
    轉化為 Map, 如果用Jackson的話,對字符串格式有嚴格要求,必須為
    String json = "{\"a\":1, \"b\":2}";
    否則報錯,覺得不爽。

    不知道是對Json了解不夠呢, 還是Jackson就是這么要求的?



    在JAVA里定義這樣一個String自然是需要"\"給后面的引號進行轉義,無論是用哪個JSON類庫都一樣,但在實際應用中,沒有這個問題。

    實際應用中json串不一定是在java中定義的,有可能是從頁面傳過來的,java只是負責解析。我以前用的是json-lib沒有問題, 但是換成jackson后出現這個問題。不知道是不是對jackson的API研究不夠?
    1.json-lib 以下寫法沒有問題
    Java代碼
  • Map?map?=?JSONObject.fromObject("{a:1,?b:2}");??

  • 2.jackson 以下寫法報異常
    Java代碼
  • Map?map?=?new?ObjectMapper().readValue("{a:1,?b:2}",?HashMap.class);??
  • 必須寫成
    Java代碼
  • Map?map?=?new?ObjectMapper().readValue("{\"a\":1,?\"b\":2}",?HashMap.class);??


  • 不好意思一開始沒明白你的意思
    請開啟支持字段名稱不帶引號的轉換模式,默認是關閉的.
    即將上面報異常的那句改成這樣: Java代碼
  • Map?map?=?new?ObjectMapper().configure(Feature.ALLOW_UNQUOTED_FIELD_NAMES,?true).readValue("{a:1,?b:2}",?HashMap.class);??
  • ?

    24 樓?wangym?2011-01-18???引用 JSON轉POJO時,若JSON中的某個字段在POJO中未定義,在默認情況下會拋異常轉換失敗,只要增加這個配置:
    ? Java代碼
  • Feature.FAIL_ON_UNKNOWN_PROPERTIES,?false??
    就可以轉換正常,即只轉換定義的字段,未定義的字段忽略。
  • 轉載于:https://www.cnblogs.com/xujishou/p/6929802.html

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的两款JSON类库Jackson与JSON-lib的性能对比(新增第三款测试)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。