fastjson支持循环引用,并且是缺省打开的。
循环引用
当序列化后的JSON传输到浏览器或者其他语言中,这些JSON解析器不支持循环引用,从而导致数据丢失。你可以关闭fastjson的循环引用支持。关闭引用检测,还能够提升序列化时的性能。
- 全局配置关闭:
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
- 非全局关闭:
JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);
语法
语法 | 描述 |
---|---|
{"$ref":"$"} |
引用根对象 |
{"$ref":"@"} |
引用自己 |
{"$ref":".."} |
引用父对象 |
{"$ref":"../.."} |
引用父对象的父对象 |
{"$ref":"$.members[0].reportTo"} |
基于路径的引用 |
Fastjson 常见问题
1. 怎么获得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>1.2.21</version> </dependency>
- Android版本
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.55.android</version> </dependency>
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是目前Java语言中最快的JSON库,比自称最快的jackson速度要快,第三方独立测试结果看这里:fastjson性能对比 。
- 自行做性能测试时,关闭循环引用检测的功能。
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
4. fastjson性能比gson怎样?
fastjson比gson快大约6倍,测试结果上这里:性能测试对比。gson的g可能是“龟”拼音的缩写,龟速的JSON库。
5. fastjson可以运行在Android上么?
fastjson有专门的for Android版本,去掉不常用的功能。jar占的字节数更小。Git branch地址是:https://github.com/alibaba/fastjson/tree/android 。
6. fastjson序列化的需要像json-lib一样配置Java bean的序列化么?
不需要,fastjson的序列化和反序列化都不需要做特别配置,唯一的要求是,你序列化的类符合Java bean规范。
7. 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)
8. 如何定制序列化?
- 你可以使用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
- 关于定制序列化,详细的介绍看这里:Fastjson定制系列化
9. 当对象存在引用时,序列化后的结果浏览器不支持,怎么办?
- 使用SerializerFeature.DisableCircularReferenceDetect特性关闭引用检测和生成。例如:
String jsonString = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);
10. IE 6不支持JSON带中文字符串,要怎么处理?
- fastjson提供了BrowserCompatible这个配置,打开之后,所有的中文都会序列化为uXXXX这种格式,字节数会多一些,但是能兼容IE 6。
String jsonString = JSON.toJSONString(obj, SerializerFeature.BrowserCompatible);