1

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

我正在使用这个stringify 函数,但我收到了这个错误:

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);

这是控制台窗口中的错误:

图片

这是我能够从 Firebug 控制台窗口中复制出来的内容:

http://pastebin.com/KPXceRag

这是该对象的屏幕截图:

图片 http://img143.imageshack.us/img143/2603/pictureos.png

4

1 回答 1

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"是否只想获取这些类型的属性。

于 2011-09-01T21:35:37.730 回答