Fastjson 循环引用和常见问题

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. 如何定制序列化?

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);