【问题标题】:Stringify JS Object to JSON (Have Functions stringify into a property)将 JS 对象字符串化为 JSON(将函数字符串化为属性)
【发布时间】:2010-06-24 17:08:44
【问题描述】:

是否有一个函数或库可以将一个具有属性和函数的 JS 对象字符串化为 JSON,但是当涉及到一个函数时,它会将其更改为一个属性并调用该函数以返回其值?

function object() {
    this.property = 12;
    this.function = function() { return "This"; }
} 

所以这会变成:

{property: 12, function: "This"}

有什么想法吗?只是好奇是否已经有一个。如果没有,我会尝试一个。扩展 JSON.stringify() 应该不难。

【问题讨论】:

  • 顺便说一句,这只是一个例子。我意识到 this.function 不会正确评估。 =)
  • 这样做没有任何意义,因为您假设所有函数都没有参数。
  • 如果你没有很多这些对象,并且它们有特殊的解释,比如你描述的字符串化版本,你最好在对象上编写自己的 toJson() 方法。
  • 我其实没想到... hrmm .. 那么为什么不把那些没有参数的字符串化呢?基本目标是将 JS 对象转换为另一种语言,并允许它拥有所有需要的信息,而无需在 JS 方面做太多工作。因此,如果您正确地构建了您的对象,并意识到会发生这种字符串化。然后准备好了,因此我只需要没有参数的;)

标签: javascript json serialization


【解决方案1】:

有些对象没有简单的序列化。 如果你想序列化它们,你必须自己用你自己的假设来做。

函数(尤其是带有闭包的函数)和 IO 流就是一些例子。在 JS 函数的情况下,序列化(没有序列化整个上下文!)违反了函数在执行上下文和作用域链方面的语义。此外,浏览器帮助返回函数“文本”的能力取决于浏览器。

【讨论】:

    【解决方案2】:

    JSON.stringify 方法提供了包含回调参数的选项,称为 replacer,该函数通过传递您的每个属性的 key 和 value 来调用对象,您可以检测该值是否为 function 并调用它:

    var obj = {
      "property": 12,
      "function": function() { return "This"; }
    };
    
    JSON.stringify(obj, function (key, value) {
      if (typeof value == 'function') {
        return value();
      }
      return value;
    });
    

    【讨论】:

    • 这几乎奏效了。如果它是一个函数,它似乎不会调用 callback() 。似乎 stringify 代码自动排除了那些。因此,如果检测到一个,我将/将不得不修改 JSON 代码以使其调用回调。很棒的发现!
    • @James,谢谢,哦,我忘了告诉你 Firefox 3.6 有一个 implementation bug 使用这个 replacer 参数。另一种选择是实现您的自定义stringify 函数,例如this。
    猜你喜欢
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 2017-05-03
    • 2021-01-12
    • 1970-01-01
    相关资源
    最近更新 更多