【问题标题】:Why doesn't JSON.stringify display object properties that are functions?为什么 JSON.stringify 不显示作为函数的对象属性?
【发布时间】:2012-05-30 13:13:44
【问题描述】:

为什么 JSON.stringify() 不显示 prop2?

var newObj = {
  prop1: true,
  prop2: function(){
    return "hello";
  },
  prop3: false
};

alert( JSON.stringify( newObj ) ); // prop2 appears to be missing

alert( newObj.prop2() ); // prop2 returns "hello"

for (var member in newObj) {
    alert( member + "=" + newObj[member] ); // shows prop1, prop2, prop3
}

JSFIDDLE:http://jsfiddle.net/egret230/efGgT/

【问题讨论】:

  • @BrandtSolovij:函数就是对象:尝试运行(function() {}) instanceof Object

标签: javascript json function object stringify


【解决方案1】:

因为JSON 不能存储函数。根据规范,值必须是以下之一:


(来源:json.org


附带说明,此代码将使JSON.stringify 注意到的功能:

Function.prototype.toJSON = function() { return "Unstorable function" }

【讨论】:

  • 那么在这种情况下,JSON不能存储undefined?
  • @Derek:正确。我认为JSON.stringify 将其转换为null
  • @Derek: JSON.stringify 省略具有 undefined 值的成员。设置为 undefined 的变量与从未设置过的变量没有区别。
  • @apsillers: ...至少从 JSON 视图来看。将属性设置为 undefined 将创建该属性。
  • Function.prototype.toJSON 不错!
【解决方案2】:

它不应该对方法(或任何函数)进行字符串化 - 特别是因为大多数内置对象的方法(以及任何用户定义对象的原型)都是本机代码。

如果您真的需要它来打印您的方法,您可以覆盖对象的 .toString 方法,但是当您在字符串化输出上调用 JSON.parse 时,它​​会将方法视为只是一个字符串,为了能够将其作为函数调用,您必须 eval 它 - 通常不推荐这种做法。

【讨论】:

    【解决方案3】:

    这是使用 .prototype 的另一种方式。您可以添加一个函数来字符串化

    JSON.stringify(obj, function(k, v) {
      if (typeof v === 'function') {
        return v + '';
      }
      return v;
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-27
      • 2016-08-09
      • 2016-07-12
      • 2019-05-07
      • 2013-02-27
      • 1970-01-01
      • 2012-05-04
      相关资源
      最近更新 更多