Java 中的 fastjson 是一个被广泛使用的 JSON 处理库,由阿里巴巴开发。它主要用于将 Java 对象转换成 JSON 字符串,以及将 JSON 字符串解析为 Java 对象。fastjson 提供了极高的性能和丰富的功能,但使用它也需要注意一些常见问题和安全风险。

1、fastjson性能

1)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的性能评价:https://groups.google.com/forum/#!topic/java-serialization-benchmarking/8eS1KOquAhw

2)fastjson性能比gson

fastjson比gson快大约6倍,测试结果看这里:https://github.com/eishay/jvm-serializers/wiki/Staging-Results

2、android上的fastjson

fastjson有专门的for android版本,去掉不常用的功能。jar占的字节数更小。git branch地址是:https://github.com/alibaba/fastjson/tree/android

3、fastjson序列化配置

fastjson不需要像json-lib一样配置java bean,fastjson的序列化和反序列化都不需要做特别配置,唯一的要求是,你序列化的类符合java bean规范。

1)fastjson定制序列化

可以使用SimplePrePropertyFilter过滤字段,详细点这里查看

关于定制序列化,详细介绍点这里查看

2)使用@JSONField定制序列化

fastjson提供了使用Annotation定制序列化和反序列化的功能:https://github.com/alibaba/fastjson/wiki/JSONField

4、特殊问题处理

1)当对象存在引用时,序列化后的结果浏览器不支持问题

使用SerializerFeature.DisableCircularReferenceDetect特性关闭引用检测和生成。例如:

String  jsonString = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);

2)IE 6不支持JSON带中文字符串问题

fastjson提供了BrowserCompatible这个配置,打开之后,所有的中文都会序列化为\uXXXX这种格式,字节数会多一些,但是能兼容IE 6。

String jsonString = JSON.toJSONString(obj, SerializerFeature.BrowserCompatible);

3)fastjson 如何处理超大对象和超大JSON文本

fastjson提供了Stream API,详细看这里 https://github.com/alibaba/fastjson/wiki/Stream-api

4)将对象中的空值输出

缺省情况下fastjson不输出对象的空值的,如果你需要输出空值,看这里 https://github.com/alibaba/fastjson/wiki/WriteNull_cn

5)返回较大整数Javascript丢失精度问题

当返回的整数大于9007199254740991或者小于-9007199254740991时,在Javascript中会丢失精度。此时使用SerializerFeature.BrowserCompatible能自动将数值变成字符串返回,解决精度问题。