5

我有一个包含循环引用的对象,我想看看它的 JSON 表示。例如,如果我构建这个对象:

var myObject = {member:{}};
myObject.member.child = {};
myObject.member.child.parent = myObject.member;

并尝试打电话

JSON.stringify(myObject);

我收到错误“递归过多”,这并不奇怪。“子”对象具有对其“父”的引用,而父对象具有对其子的引用。JSON 表示不必完全准确,因为我只是将它用于调试,而不是用于将数据发送到服务器或将对象序列化为文件或类似的东西。有没有办法告诉 JSON.stringify 忽略某些属性(在这种情况下parent是子对象的属性),这样我会得到:

{
    "member" : {
        "child" : {}
    }
}

我能想到的最接近的方法是使用getChild()andgetParent()方法而不仅仅是成员,因为 JSON.stringify 会忽略任何作为函数的属性,但如果我不必这样做,我宁愿不这样做。

4

2 回答 2

8

您可以将函数作为第二个参数传递给 stringify。此函数接收要字符串化的成员的键和值作为参数。如果此函数返回未定义,则该成员将被忽略。

alert(JSON.stringify(myObject, function(k, v) {
    return (k === 'member') ? undefined : v;
}));

...或使用例如 firebug 或使用 toSource() 方法,如果您只想查看对象内部的内容。

alert(myObject.toSource());
于 2010-10-09T02:34:10.233 回答
6

从 crockford 实现(遵循ECMA 规范):

如果 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/

于 2010-10-09T02:35:28.070 回答