fastjson所需的依赖_fastjson循环依赖

举个例子

HashMap map = new HashMap();

map.put("foo", map);

System.out.println(map);

输出是:{foo=(this Map)},this Map代表map自己引用自己。

如果用fastjson序列换成json会怎么样呢?

fastjson处理json序列化的方法都放在JSON类中,主要有3个方法:

toJSON()

toJSONString()

toJSONByteds()

toJSON()

HashMap map = new HashMap();

map.put("foo", map);

System.out.println(JSON.toJSON(map));

汇报异常Exception in thread "main" java.lang.StackOverflowError,原因跟toJSON实现方式有关

JSONObject json = new JSONObject(innerMap);

for (Map.Entry entry : map.entrySet()) {

Object key = entry.getKey();

String jsonKey = TypeUtils.castToString(key);

Object jsonValue = toJSON(entry.getValue());//

json.put(jsonKey, jsonValue);

}

可以看到对Map的value还会调用toJSON方法,造成了死循环,且对value处理前任何配置都没生效,所以toJSON方法对循环引用无解。

尝试一下toJSONString和toJSONBytes方法

HashMap map = new HashMap();

map.put("foo", map);

System.out.println(JSON.toJSONString(map));

System.out.println(new String(JSON.toJSONBytes(map)));

输出:{"foo":{"$ref":"@"}},跟直接print输出一致。这两个方法会依据配置SerializerFeature.DisableCircularReferenceDetect来控制是否开启重复引用检查,在处理value时判断上下文中是否已经存在对象。如果开启配置,且上下文中value对象已存在则用引用形式表示。

//JavaBeanSerializer.class

public boolean writeReference(JSONSerializer serializer, Object object, int fieldFeatures) {

SerialContext context = serializer.context;

int mask = SerializerFeature.DisableCircularReferenceDetect.mask;

if (context == null || (context.features & mask) != 0 || (fieldFeatures & mask) != 0) {//

return false;

}

if (serializer.references != null && serializer.references.containsKey(object)) {

serializer.writeReference(object);

return true;

} else {

return false;

}

}

不同层级的引用会以不同的符号代替,具体可以参考JSONSerializer.writeReference()方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值