【问题标题】:JSON stringify objects excluding methodsJSON 字符串化对象,不包括方法
【发布时间】:2011-11-08 18:00:51
【问题描述】:

我正在开发一个 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);

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

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

http://pastebin.com/KPXceRag

这是对象的截图:

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

【问题讨论】:

  • 请提供您要字符串化的示例字符串。谢谢。
  • 对象是否以某种方式引用自身?
  • @ChaosPandion - 可能,是的。但是我使用的函数应该处理递归。不过,我只复制/粘贴了该功能,因此可能需要对其进行调整。我猜 JSON.stringify 不处理它,或者它并不总是可用?

标签: javascript json firefox firebug stringify


【解决方案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"}'

在您的情况下,您应该能够在调用JSON.stringify 之前即时为gContextMenu 定义此方法。这确实需要你明确定义你想要什么和不想要什么,但我认为没有更好的方法。

编辑:如果你想提取所有非方法值,你可以尝试这样的事情:

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"

【讨论】:

  • 我们如何添加一个循环来返回所有属性但不返回方法?或者,也许所有属性都是字符串?我不知道会出现哪些物品,并试图抓住所有物品。
猜你喜欢
  • 2021-07-03
  • 2019-10-03
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多