2010-10-09 18 views
4

我有一個包含循環引用的對象,我想查看它的JSON表示。例如,如果我建立這個對象:在循環依賴的大型對象上調用JSON.stringify時出現「遞歸太多」錯誤

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忽略任何屬性是函數,但我寧願不這樣做,如果我不必。

+0

都已經提供了還在給我「太多遞歸」錯誤做法的 - 也許有一些其他的奇怪的依賴,我沒有看到。 – MatrixFrog 2010-12-08 00:23:56

回答

8

您可以將函數作爲第二個參數傳遞給stringify。 此函數接收作爲參數的成員的字符串化的鍵和值。 如果此函數返回undefined,則該成員將被忽略。

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

...或使用例如螢火蟲或使用toSource() - 方法,如果你只想看看對象內部有什麼。

alert(myObject.toSource()); 
+0

['Object.toSource()'](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/toSource)是一個非標準的,僅限Firefox的功能。 – 2010-10-09 02:39:49

+5

Object.toSource()是在Javascript 1.3中引入的,如果它在Firefox中有效,它不是一個「看一看」的不好功能。用於調試,無論它是否是ECMAScript的一部分。 – 2010-10-09 02:56:57

6

From the crockford implementation(下面the ECMA specification):

如果字符串化方法看到包含的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/

相關問題