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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值