JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格式,应该在一个程序员的开发生涯中是常接触的。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
Java是面向对象的语言,所以我们更多的在项目中是以对象的形式处理业务的,但是在传输的时候我们却要将对象转换为 JSON 格式便于传输,而且 JSON 格式一般能解析为大多数的对象格式,而不在乎编程语言。
现在主流的对象与 JSON 互转的工具很多,我们主要介绍今天的主角,阿里巴巴的开源库 - Fastjson。Fastjson是一个Java库,可用于将Java对象转换为其JSON表示。它还可用于将JSON字符串转换为等效的Java对象。Fastjson可以处理任意Java对象,包括您没有源代码的预先存在的对象。
什么是 Fastjson?阿里官方给的定义是, fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。
Fastjson 的优点
速度快
fastjson相对其他JSON库的特点是快,从2011年fastjson发布1.1.x版本之后,其性能从未被其他Java实现的JSON库超越。
使用广泛
fastjson在阿里巴巴大规模使用,在数万台服务器上部署,fastjson在业界被广泛接受。在2012年被开源中国评选为最受欢迎的国产开源软件之一。
测试完备
fastjson有非常多的testcase,在1.2.11版本中,testcase超过3321个。每次发布都会进行回归测试,保证质量稳定。
使用简单
fastjson的 API 十分简洁。
功能完备
支持泛型,支持流处理超大文本,支持枚举,支持序列化和反序列化扩展。
你可以通过如下地方下载fastjson:
maven中央仓库:
Sourceforge.net : https://sourceforge.net/projects/fastjson/files/
在maven项目的pom文件中直接配置fastjson依赖
fastjson最新版本都会发布到maven中央仓库,你可以直接依赖。
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>x.x.x</version> </dependency>其中x.x.x是版本号,根据需要使用特定版本,建议使用最新版本。
Fastjson 主要的APIFastjson入口类是 com.alibaba.fastjson.JSON,主要的 API 是 JSON.toJSONString 和 parseObject。
package com.alibaba.fastjson; public abstract class JSON { // Java对象转换为JSON字符串 public static final String toJSONString(Object object); //JSON字符串转换为Java对象 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>>() {}); Fastjson 的性能fastjson是目前java语言中最快的json库,比自称最快的jackson速度还要快,第三方独立测试结果看这里:https://github.com/eishay/jvm-serializers/wiki。
自行做性能测试时,需关闭循环引用检测的功能。
JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect) VO vo = JSON.parseObject("...", VO.class, Feature.DisableCircularReferenceDetect)另外,Fastjson 比 Gson 快大约6倍,测试结果可以看这里:
Checking correctness… [done] Pre-warmup… java-built-in hessian kryo protostuff-runtime avro-generic msgpack json/jackson/databind json/jackson/databind-strings json/jackson/db-afterburner json/google-gson/databind json/svenson-databind json/flexjson/databind json/fastjson/databind smile/jackson/databind smile/jackson/db-afterburner smile/protostuff-runtime bson/jackson/databind xml/xstream+c xml/jackson/databind-aalto [done] pre. create ser deser shal +deep total size +dfl java-built-in 63 5523 27765 28084 28162 33686 889 514 hessian 64 3776 6459 6505 6690 10466 501 313 kryo 63 809 962 937 1001 1810 214 133 protostuff-runtime 62 671 903 920 957 1627 241 151 avro-generic 436 1234 1122 1416 1760 2994 221 133 msgpack 61 789 1369 1385 1449 2238 233 146 json/jackson/databind 60 1772 3089 3113 3246 5018 485 261 json/jackson/databind-strings 64 2346 3739 3791 3921 6267 485 261 json/jackson/db-afterburner 64 1482 2220 2233 2323 3805 485 261 json/google-gson/databind 64 7076 4894 4962 5000 12076 486 259 json/svenson-databind 64 5422 12387 12569 12468 17890 495 266 json/flexjson/databind 62 20923 26853 26873 27272 48195 503 273 json/fastjson/databind 63 1250 1208 1206 1247 2497 486 262 smile/jackson/databind 60 1697 2117 2290 2298 3996 338 241 smile/jackson/db-afterburner 60 1300 1614 1648 1703 3003 352 252 smile/protostuff-runtime 61 1275 1612 1638 1685 2961 335 235 bson/jackson/databind 63 5151 6729 6977 6918 12069 506 286 xml/xstreamc 62 6358 13208 13319 13516 19874 487 244 xml/jackson/databind-aalto 62 2955 5332 5465 5584 8539 683 286 Fastjson 使用示例我们创建一个班级的对象,和一个学生对象如下: