我有一个包含循环引用的对象,我想看一下它的JSON表示。例如,如果我构建此对象:
var myObject = {member:{}};
myObject.member.child = {};
myObject.member.child.parent = myObject.member;
并尝试致电
JSON.stringify(myObject);
我得到错误“太多的递归”,这并不奇怪。 “child”对象具有对其“parent”的引用,而父对象具有对其子对象的引用。 JSON表示不必非常准确,因为我只是将它用于调试,而不是将数据发送到服务器或将对象序列化为文件或类似的东西。有没有办法告诉JSON.stringify只是忽略某些属性(在这种情况下是子对象的parent
属性),所以我会得到:
{
"member" : {
"child" : {}
}
}
我能想到的最接近的是使用getChild()
和getParent()
方法而不仅仅是成员,因为JSON.stringify忽略了任何属性的属性,但如果我不愿意,那我就不会这样做不必。
答案 0 :(得分:8)
您可以将函数作为第二个参数传递给stringify。 此函数接收成员的键和值的参数作为参数。 如果此函数返回undefined,则将忽略该成员。
alert(JSON.stringify(myObject, function(k, v) {
return (k === 'member') ? undefined : v;
}));
...或使用例如firebug或使用toSource() - 方法,如果你只想看到对象里面的内容。
alert(myObject.toSource());
答案 1 :(得分:6)
From the crockford implementation(在the ECMA specification之后):
如果stringify方法看到包含toJSON方法的对象,则它会调用该方法,并将返回的值字符串化。这允许对象确定自己的JSON表示。
然后这样的事情应该可以正常工作:
var myObject =
{
member: { child: {} }
}
myObject.member.child.parent = myObject.member;
myObject.member.child.toJSON = function ()
{
return 'no more recursion for you.';
};
console.log(JSON.stringify(myObject));