1、场景javascript
在使用序列化的时候,Object里包含了两个如出一辙的对象,因此解析的时候,只有第一个能解析出来,另一个没法显示。php
查看了json的序列化源码,发现是DisableCircularReferenceDetecte特性,防止对象互相引用,致使死循环的解析。css
可使用String jsonString = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect )来解决。java
2、上网搜了资料,才发现fastjson有不少常见的问题,转载自https://my.oschina.net/zhongwenhao/blog/212101git
fastjson入口类是com.alibaba.fastjson.JSON,主要的API是JSON.toJSONString,和parseObject。github
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); }
序列化:json
String jsonString = JSON.toJSONString(obj);
反序列化:api
VO vo = JSON.parseObject("...", VO.class);
泛型反序列化:浏览器
import com.alibaba.fastjson.TypeReference;
List<VO> list = JSON.parseObject("...", new TypeReference<List<VO>>() {});
fastjson是目前java语言中最快的json库,比自称最快的jackson速度要快,第三方独立测试结果看这里:https://github.com/eishay/jvm-serializers/wiki/Staging-Results 。jvm
自行作性能测试时,关闭循环引用检测的功能。
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
fastjson比gson快大约6倍,测试结果上这里:https://github.com/eishay/jvm-serializers/wiki/Staging-Results 。gson的g多是“龟”拼音的缩写,龟速的json库。
不须要,fastjson的序列化和反序列化都不须要作特别配置,惟一的要求是,你序列化的类符合java bean规范。
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);
反序列化可以自动识别以下日期格式:
你可使用SimplePrePropertyFilter过滤字段,详细看这里:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=7673519
关于定制序列化,详细的介绍看这里: https://github.com/alibaba/fastjson/wiki/%E5%AE%9A%E5%88%B6%E5%BA%8F%E5%88%97%E5%8C%96
使用SerializerFeature.DisableCircularReferenceDetect特性关闭引用检测和生成。例如:
String jsonString = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect );
fastjson提供了BrowserCompatible这个配置,打开以后,全部的中文都会序列化为\uXXXX这种格式,字节数会多一些,可是能兼容IE 6。
String jsonString = JSON.toJSONString(obj, SerializerFeature.BrowserCompatible );
fastjson提供了Stream API,详细看这里 https://github.com/alibaba/fastjson/wiki/Stream-api