問題背景
循環(huán)列表賦值
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是同一個(gè)钞馁,userExtendEntity會取到相同的對象虑省,在用fastjson轉(zhuǎn)json返回客戶端數(shù)據(jù)的時(shí)候就會轉(zhuǎn)為引用數(shù)據(jù),類似"$ref": "$.list[0].relationship"
$ref
代表引用僧凰,它是FastJson在轉(zhuǎn)換Json字符串的時(shí)候出現(xiàn)的慷妙,在引用了同一對象時(shí)出現(xiàn)。
“$”
代表根對象允悦,告訴我們引用了哪個(gè)對象。
解決方案
方案一:
Json.JSON.toJSONString(result, SerializerFeature.DisableCircularReferenceDetect)
在這里DisableCircularReferenceDetect
禁止循環(huán)引用檢測.
SerializerFeature.DisableCircularReferenceDetect
當(dāng)開啟這個(gè)屬性時(shí),fastjson可能會出現(xiàn)Stack溢出的報(bào)錯(cuò)虑啤。 當(dāng)關(guān)閉這個(gè)屬性后隙弛,fastjson就不會檢測循環(huán)引用a引用b,b引用a這類的問題,導(dǎo)致堆棧溢出
方案二:
修改代碼狞山,盡量不要寫重復(fù)引用的代碼
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);
}