我正在开发一个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控制台窗口中复制的内容:
以下是该对象的屏幕截图:
答案 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"
。