Fastjson:Java高性能JSON庫,序列化與反序列化

fastjson

Fastjson是一個Java語言編寫的高性能功能完善的JSON庫。它採用一種“假定有序快速匹配”的算法,把JSON Parse的性能提升到極致,是目前Java語言中最快的JSON庫。Fastjson接口簡單易用,已經被廣泛使用在緩存序列化、協議交互、Web輸出、Android客戶端等多種應用場景。

主要特點

  • 快速:測試結果比其他Java解析器(包括jackson)或databinder更快。
  • 強大:支持綁定常用JDK類以及Java Bean class、Collection、Map、Date 或 enum。
  • 除JDK以外不依賴其他第三方庫。
  • 遵循Apache 2.0開源協議發佈。

基準測試

測試代碼:https://github.com/wenshao/jvm-serializers

測試結果,時間單位爲納秒,size大小爲字節。

                                 create     ser   +same   deser   +shal   +deep   total   size  +dfl
kryo                                119    1335    1273    1562    1709    1689    3024    223   140
java-manual                         119    2129    2055    1005    1031    1062    3191    255   147
json/fastjson/databind              117    1809    1687    1741    1786    1907    3715    486   262
msgpack                             117    1827    1582    1985    2020    2118    3945    233   146
json/jackson/manual                 118    1672    1501    2235    2232    2365    4037    468   253
protobuf                            227    2939    1362    1626    1661    1965    4904    239   149
thrift                              242    3157    2898    2031    2116    2194    5351    349   197
json/jackson/databind               119    2851    2726    3941    4008    4154    7005    485   261
hessian                             117    6135    5513   10082   10204   10311   16446    501   313
json/google-gson/databind           117   11309   11304    7913    7967    8076   19385    486   259
json/json-lib-databind              119   45547   45114  145951  145866  146582  192129 

結果說明:

  • create:創建對象(使用序列化工具指定的類)。
  • ser:創建對象並序列化。
  • +same:序列化相同的對象(例如,不包括創建時間)
  • deser:反序列化對象。
  • +shal:反序列化對象並訪問頂層字段。
  • +deep:反序列化對象並訪問所有字段。
  • total:創建 + 序列化 + 反序列化 並訪問所有字段。
  • size:序列化後數據大小。
  • +dfl:使用Java自帶DEFLATE(zilib)方法壓縮後的序列化數據大小。

FAQ

1. 怎麼獲得fastjson?

你可以通過如下地方下載fastjson:

  • maven中央倉庫: http://central.maven.org/maven2/com/alibaba/fastjson/
  • Sourceforge.net : https://sourceforge.net/projects/fastjson/files/
  • 在maven中如何配置fastjson依賴 fastjson最新版本都會發布到maven中央倉庫,你可以直接依賴。
  <dependency>
       <groupId>com.alibaba</groupId>
       <artifactId>fastjson</artifactId>
       <version>x.x.x</version>
  </dependency>

其中x.x.x不是具體的版本號,最新版本你通過fastjson的首頁( https://github.com/alibaba/fastjson/wiki )獲得。

2. fastjson主要的API哪些?

fastjson入口類是com.alibaba.fastjson.JSON,主要的API是JSON.toJSONString 和 parseObject。

  package com.alibaba.fastjson;
  public abstract class JSON {
        public static final String toJSONString(Object object);
        public static final <T> T parseObject(String text, Class<T> clazz, Feature... features);
  }

序列化:

  String jsonString = JSON.toJSONString(obj);

反序列化:

  VO vo = JSON.parseObject("...", VO.class);

泛型反序列化:

  import com.alibaba.fastjson.TypeReference;

  List<VO> list = JSON.parseObject("...", new TypeReference<List<VO>>() {});

 3. 哪裏找fastjson的使用例子

fastjson的使用例子看這裏:https://github.com/alibaba/fastjson/wiki/Samples-DataBind

4. fastjson的性能如何?

fastjson是目前java語言中最快的json庫,比自稱最快的jackson速度要快,第三方獨立測試結果看這裏:https://github.com/eishay/jvm-serializers/wiki/Staging-Results 。

自行做性能測試時,關閉循環引用檢測的功能。

  JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect)
  VO vo = JSON.parseObject("...", VO.class, Feature.DisableCircularReferenceDetect)

這裏有jackson作者cowtowncoder等人對fastjson的性能評價: https://groups.google.com/forum/#!topic/java-serialization-benchmarking/8eS1KOquAhw

5. fastjson性能比gson怎樣?

fastjson比gson快大約6倍,測試結果上這裏:https://github.com/eishay/jvm-serializers/wiki/Staging-Results 

6. fastjson可以運行在Android上麼?

fastjson有專門的for android版本,去掉不常用的功能。jar佔的字節數更小。git branch地址是:https://github.com/alibaba/fastjson/tree/android 

7. fastjson序列化的需要像json-lib一樣配置Java bean的序列化麼?

不需要,fastjson的序列化和反序列化都不需要做特別配置,唯一的要求是,你序列化的類符合java bean規範。

8. fastjson如何處理日期

fastjson處理日期的API很簡單,例如:

  JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss.SSS")

使用ISO-8601日期格式

  JSON.toJSONString(obj, SerializerFeature.UseISO8601DateFormat);

全局修改日期格式

  JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
  JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);

反序列化能夠自動識別如下日期格式:

  • ISO-8601日期格式
  • yyyy-MM-dd
  • yyyy-MM-dd HH:mm:ss
  • yyyy-MM-dd HH:mm:ss.SSS
  • 毫秒數字
  • 毫秒數字字符串
  • .NET JSON日期格式
  • new Date(198293238)

9. 如何定製序列化?

你可以使用SimplePrePropertyFilter過濾字段,詳細看這裏:https://github.com/alibaba/fastjson/wiki/%E4%BD%BF%E7%94%A8SimplePropertyPreFilter%E8%BF%87%E6%BB%A4%E5%B1%9E%E6%80%A7

關於定製序列化,詳細的介紹看這裏: https://github.com/alibaba/fastjson/wiki/%E5%AE%9A%E5%88%B6%E5%BA%8F%E5%88%97%E5%8C%96

10. 當對象存在引用時,序列化後的結果瀏覽器不支持,怎麼辦?

使用SerializerFeature.DisableCircularReferenceDetect特性關閉引用檢測和生成。例如:

  String  jsonString = JSON.toJSONString(obj, 
          SerializerFeature.DisableCircularReferenceDetect
          );

 11. IE 6不支持JSON帶中文字符串,要怎麼處理?

fastjson提供了BrowserCompatible這個配置,打開之後,所有的中文都會序列化爲\uXXXX這種格式,字節數會多一些,但是能兼容IE 6。

  String  jsonString = JSON.toJSONString(obj, 
          SerializerFeature.BrowserCompatible
          );

12. fastjson 如何處理超大對象和超大JSON文本

fastjson提供了Stream API,詳細看這裏 https://github.com/alibaba/fastjson/wiki/Stream-api

13. 使用@JSONField定製序列化

fastjson提供了使用Annotation定製序列化和反序列化的功能。https://github.com/alibaba/fastjson/wiki/JSONField

官方網站:https://github.com/alibaba/fastjson/wiki
開源地址:https://github.com/Alibaba/fastjson

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章