JSON stringify对象排除方法

时间:2011-09-01 21:16:08

标签: javascript json firefox firebug stringify

我正在开发一个Firefox扩展程序,我正在尝试对JSON对象进行字符串化。

我正在使用此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

1 个答案:

答案 0 :(得分: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"