ошибка "слишком много рекурсии" при вызове JSON.stringify для большого объекта с круговыми зависимостями - PullRequest
4 голосов
/ 09 октября 2010

У меня есть объект, который содержит циклические ссылки, и я хотел бы взглянуть на его JSON-представление. Например, если я строю этот объект:

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

и попробуйте позвонить

JSON.stringify(myObject);

Я получаю ошибку "слишком много рекурсии", что неудивительно. «Дочерний» объект имеет ссылку на своего «родителя», а родительский имеет ссылку на своего потомка. Представление JSON не обязательно должно быть абсолютно точным, поскольку я использую его только для отладки, а не для отправки данных на сервер или сериализации объекта в файл или что-то в этом роде. Есть ли способ указать JSON.stringify просто игнорировать определенные свойства (в этом случае свойство parent дочернего объекта), чтобы я мог получить:

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

Самое близкое, что я могу придумать, - это использовать методы getChild() и getParent() вместо просто элементов, потому что JSON.stringify игнорирует любые свойства, которые являются функциями, но я бы не стал этого делать, если у меня к.

Ответы [ 2 ]

8 голосов
/ 09 октября 2010

Вы можете передать функцию в качестве второго аргумента для stringify. Эта функция получает в качестве аргументов ключ и значение члена для stringify. Если эта функция возвращает неопределенное значение, элемент будет игнорироваться.

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

... или используйте, например, firebug или используйте метод toSource (), если вы хотите видеть только то, что находится внутри объекта.

alert(myObject.toSource());
6 голосов
/ 09 октября 2010

Из реализации Крокфорда (что следует спецификации 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/

...