在使用fastjson时的循环引用导致前端解析json出现问题
循环引用意思是a对象中有b对象,b对象中有a对象,json如果要完整表达这种数据结构会字符串将会无穷大,所以fastjson处理方式是将重复的内容使用引用
例如
{
code:0 ,
msg:"ok" ,
data:[
{a:100 , b:200 , c:{m:50 , n:100 }} ,
{"$ref":"$.data[0].c"}
]
}
上面是问题json,使用下面的函数即可解决这种问题
var json = (function(){
var parse = function(obj) {
for(var i in obj) {
obj[i] = into(obj , obj , i)
}
return obj ;
}
var into = function(root , obj , k) {
if(typeof(obj[k]) == "object") {
for(var i in obj[k]) {
if(i == "$ref") {
obj[k] = into(root , obj[k] , i)
}else{
obj[k][i] = into(root , obj[k] , i)
}
}
return obj[k]
}
if(typeof(obj[k]) == "string") {
if(obj[k].startsWith("$.")) {
var res = eval("root."+obj[k].substr(2))
obj[k] = res
return obj[k]
}else if(obj[k].startsWith("$[")){
var res = eval("root"+obj[k].substr(1))
obj[k] = res
return obj[k]
}
return obj[k]
}
return obj[k]
}
return {parse:parse} ;
})()
简单验证一下
console.log(json.parse({
code:0 ,
msg:"ok" ,
data:[
{a:100 , b:200 , c:{m:50 , n:100 }} ,
{"$ref":"$.data[0].c"}
]
}))
打印结果是
{
"code": 0,
"msg": "ok",
"data": [{
"a": 100,
"b": 200,
"c": {
"m": 50,
"n": 100
}
}, {
"m": 50,
"n": 100
}]
}
问题已经解决