在具有循环依赖关系的大对象上调用JSON.stringify时出现“太多递归”错误

时间:2010-10-09 02:07:03

标签: javascript json firefox-addon circular-dependency

我有一个包含循环引用的对象,我想看一下它的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忽略了任何属性的属性,但如果我不愿意,那我就不会这样做不必。

2 个答案:

答案 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));​

http://jsfiddle.net/feUtk/