问题背景
循环列表赋值
for (UserInfoEntity entity : UserInfoList) {
Long userId = userEntity.getId();
Integer customId = userIdMap.get(userId);
if (customId == null) {
continue;
}
UserExtendEntity userExtendEntity = userExtendMap.get(customId);
if (userExtendEntity == null) {
continue;
}
entity.setExtend(userExtendEntity);
}
在此代码中,假如customId是同一个,userExtendEntity会取到相同的对象,在用fastjson转json返回客户端数据的时候就会转为引用数据,类似"$ref": "$.list[0].relationship"
$ref
代表引用,它是FastJson在转换Json字符串的时候出现的,在引用了同一对象时出现。
“$”
代表根对象,告诉我们引用了哪个对象。
解决方案
方案一:
Json.JSON.toJSONString(result, SerializerFeature.DisableCircularReferenceDetect)
在这里DisableCircularReferenceDetect
禁止循环引用检测.
SerializerFeature.DisableCircularReferenceDetect
当开启这个属性时,fastjson可能会出现Stack溢出的报错。 当关闭这个属性后,fastjson就不会检测循环引用a引用b,b引用a这类的问题,导致堆栈溢出
方案二:
修改代码,尽量不要写重复引用的代码
for (UserInfoEntity entity : UserInfoList) {
Long userId = userEntity.getId();
Integer customId = userIdMap.get(userId);
if (customId == null) {
continue;
}
UserExtendEntity userExtendEntity = userExtendMap.get(customId);
if (userExtendEntity == null) {
continue;
}
UserExtendEntity userExtend=(UserExtendEntity) userExtendEntity.clone();
entity.setExtend(userExtend);
}