Fastjson:Java高性能JSON库
2016-12-24 14:07
302 查看
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大小为字节。
Shell
create ser +same deser +shal +deep total size +dflkryo 119 1335 1273 1562 1709 1689 3024 223 140java-manual 119 2129 2055 1005 1031 1062 3191 255 147json/fastjson/databind 117 1809 1687 1741 1786 1907 3715 486 262msgpack 117 1827 1582 1985 2020 2118 3945 233 146json/jackson/manual 118 1672 1501 2235 2232 2365 4037 468 253protobuf 227 2939 1362 1626 1661 1965 4904 239 149thrift 242 3157 2898 2031 2116 2194 5351 349 197json/jackson/databind 119 2851 2726 3941 4008 4154 7005 485 261hessian 117 6135 5513 10082 10204 10311 16446 501 313json/google-gson/databind 117 11309 11304 7913 7967 8076 19385 486 259json/json-lib-databind 119 45547 45114 145951 145866 146582 192129 485 263 |
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中央仓库,你可以直接依赖。XHTML
1 2 3 4 5 | <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>x.x.x</version> </dependency> |
2. fastjson主要的API哪些?
fastjson入口类是com.alibaba.fastjson.JSON,主要的API是JSON.toJSONString 和 parseObject。Java
12345 | 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); } |
1 | String jsonString = JSON.toJSONString(obj); |
Java
1 | VO vo = JSON.parseObject("...", VO.class); |
1 2 3 | 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 。自行做性能测试时,关闭循环引用检测的功能。
Java
12 | JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect) VO vo = JSON.parseObject("...", VO.class, Feature.DisableCircularReferenceDetect) |
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很简单,例如:Java1 | JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss.SSS") |
Java
1 | JSON.toJSONString(obj, SerializerFeature.UseISO8601DateFormat); |
1 2 | 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特性关闭引用检测和生成。例如:Java
123 | String jsonString = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect ); |
11. IE 6不支持JSON带中文字符串,要怎么处理?
fastjson提供了BrowserCompatible这个配置,打开之后,所有的中文都会序列化为\uXXXX这种格式,字节数会多一些,但是能兼容IE 6。Java1 2 3 | 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
相关文章推荐
- Fastjson是一个Java语言编写的高性能功能完善的JSON库。
- FastJson---高性能JSON开发包
- FastJson---高性能JSON开发包
- fastjson 第三方jar和java各种数据对象相互转化
- 高性能JSON库---FastJson(阿里巴巴)
- json-lib(ezmorph)、gson、flexJson、fastjson、jackson对比,实现java转json,json转java
- FastJson---高性能JSON开发包
- fastjson parseObject java.lang.IncompatibleClassChangeError
- Restlet+Fastjson 快速构建轻量级 Java RESTful Webservice
- FastJson---高性能JSON开发包
- Java序列化与JSON序列化大比拼2(alibaba/fastjson)
- [javase][json]fastJson在java后台转换json格式数据探究--处理数组/List/Map
- fastjson 1.1.32 发布,Java 的 JSON 库
- fastjson 第三方jar和java各种数据对象相互转化
- fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map
- fastJson在java后台转换json格式数据探究(一)
- FastJson---高性能JSON开发包
- FastJson关于java的使用
- json-lib(ezmorph)、gson、flexJson、fastjson、jackson对比,实现java转json,json转java
- FastJson 高性能JSON开发包