2011-09-01 72 views
1

我正在研究一個Firefox擴展,我試圖串化一個JSON對象。JSON stringify對象,不包括方法

我使用這個stringify function但我得到這個錯誤:

Could not convert JavaScript argument "NS_ERROR_XPC_BAD_CONVERT_JS"

我真的只是關心的對象內的第一級或兩個或屬性,我不關心方法/功能。如果我不需要所有這些,是否有更簡單的方法來將對象串聯起來?

這裏的代碼位我使用:

var s=JSONstring.make('abc'); 

    try{ 

     Firebug.Console.log(gContextMenu); 

     s = JSON.stringify(gContextMenu); 

     Firebug.Console.log(s); 
    }catch(e){ 
     Firebug.Console.log('error'); 
     Firebug.Console.log(e); 
    } 
    var s=JSONstring.make('abc'); 
    Firebug.Console.log(s); 
    Firebug.Console.log(gContextMenu); 

這是在控制檯窗口中的錯誤:

image http://img845.imageshack.us/img845/5554/picture1npb.png

這是我能複製出來的Firebug控制檯窗口:

http://pastebin.com/KPXceRag

這裏是對象的截圖:

image http://img143.imageshack.us/img143/2603/pictureos.png

+0

請提供您想要串聯的示例字符串。謝謝。 –

+0

對象是否以某種方式引用它自己? – ChaosPandion

+0

@ChaosPandion - 可能,是的。但我使用的功能應該是處理遞歸。不過,我只複製/粘貼該功能,所以可能需要調整。我猜JSON.stringify不處理它,或者這並不總是可用? – cwd

回答

1

您可以定義對象的自定義函數調用toJSON()只返回你想要的對象的元素。有點反直覺,你的toJSON函數應該而不是返回一個JSON字符串 - 它只是返回一個對象,表示應當用作JSON.stringify的輸入。

例如:

// an object with some attributes you want and some you don't 
var o = { 
    a:"value1", 
    b:"value2", 
    doCalc: function() { return this.a + " " + this.b } 
}; 
// define a custom toJSON() method 
o.toJSON = function() { 
    return { 
     a:this.a, 
     calc: this.doCalc() 
    } 
}; 

JSON.stringify(o); // '{"a":"value","calc":"value1 value2"}' 

在你的情況,你應該能夠確定這種方法gContextMenu上的蒼蠅,調用JSON.stringify之前。這確實需要你明確地定義你想要的和不想要的,但我認爲沒有更好的方法。

編輯:如果你想拉的所有非法值,你可以嘗試這樣的事:

o.toJSON = function() { 
    var attrs = {}; 
    for (var attr in this) { 
     if (typeof this[attr] != "function") { 
      attrs[attr] = String(this[attr]); // force to string 
     } 
    } 
    return attrs; 
}; 

你最終可能會與設置爲"[object Object]"的幾個屬性,但如果你要檢查,這可能不是問題。如果您只想獲得這些類型的屬性,您也可以嘗試檢查typeof this[attr] == "string" || typeof this[attr] == "number"

+1

我們如何添加一個循環來返回所有的屬性,但不是方法?或者,也許所有屬性都是字符串?我不知道哪些項目會出現,並試圖抓住他們。 – cwd

+0

非常感謝! – cwd