2010-10-09 4 views
4

У меня есть объект, содержащий круговые ссылки, и я хотел бы посмотреть его представление JSON. Например, если я построить этот объект:Ошибка «слишком много рекурсии» при вызове JSON.stringify на большом объекте с круговыми зависимостями

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

и попытаться вызвать

JSON.stringify(myObject); 

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

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

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

+0

Оба подхода, которые были предложены еще дает мне «слишком много рекурсии» ошибки - может быть, есть какой-то другой странную зависимость, которую я не вижу. – MatrixFrog

ответ

8

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

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

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

alert(myObject.toSource()); 
+0

['Object.toSource()'] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/toSource) является нестандартной функцией Firefox. –

+5

Object.toSource() был введен в Javascript 1.3, и если он работает в Firefox, это неплохая функция «взглянуть», например. для отладки, является ли его частью ECMAScript или нет. –

6

From the crockford implementation (который следует the ECMA specification):

Если stringify метод видит объект, который содержит метод toJSON, он вызывает этот метод, и stringifies возвращаемого значения. Это позволяет объекту определять собственное представление 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/