【问题标题】:JSON.stringify ignore some object membersJSON.stringify 忽略一些对象成员
【发布时间】:2011-11-18 06:12:04
【问题描述】:

这是一个简单的例子。

function Person() {
  this.name = "Ted";
  this.age = 5;
}

persons[0] = new Person();
persons[1] = new Person();
JSON.stringify(persons);

如果我有一个 Person 对象的 array,并且我想对它们进行字符串化。如何只返回带有 name 变量的 JSON。

这样做的原因是,我有一些带有递归引用的大型对象会导致问题。我想从字符串化过程中删除递归变量和其他变量。

感谢您的帮助!

【问题讨论】:

    标签: javascript jquery json stringify


    【解决方案1】:

    最简单的答案是指定要字符串化的属性

    JSON.stringify( persons, ["name"] )
    

    另一种选择是将 toJSON 方法添加到您的对象

    function Person(){
      this.name = "Ted";
      this.age = 5;      
    }
    Person.prototype.toJSON = function(){ return this.name };
    

    更多:http://www.json.org/js.html

    【讨论】:

    • 这似乎比接受的答案更好。您可以使用 replacer 参数编写一个函数,该函数将排除您不想在对象中序列化的 w/e 属性。
    【解决方案2】:

    see this post 指定您想要包含的字段。 JSON.stringify(person,["name","Address", "Line1", "City"]) 它比上面建议的更匹配!

    【讨论】:

      【解决方案3】:

      我会创建一个新数组:

      var personNames = $.map(persons,function(person){
        return person.name;
      });
      var jsonStr = JSON.stringify(personNames);
      

      【讨论】:

      • 如果我想返回多个值,我可以将它们放在一个数组中吗?抱歉,我现在无法访问我的代码来为自己尝试。
      • 你会返回一个属性映射,例如return { name: person.name, id: person.id };
      • 我不能让它工作,使用你的代码只是返回整个 person 对象。你确定这是正确的吗? jQuery API 中 .grep 的示例使用该函数返回一个布尔值,确定整个对象是否包含在数组中。不定义包含哪些变量。
      • 对不起,我用错了方法。应该是 $.map,我会更新答案。
      • 还有一件事,目前正在返回一个对象。我实际上想要数据数组,单个数组中的数组。有没有简单的方法可以做到这一点?
      【解决方案4】:

      如果您只支持与 ECMAScript 5 兼容的环境,则可以通过使用 Object.defineProperty()[docs]Object.defineProperties()[docs] 设置应排除的属性不可枚举

      function Person() {
          this.name = "Ted";
          Object.defineProperty( this, 'age', {
              value:5,
              writable:true,
              configurable:true,
              enumerable:false // this is the default value, so it could be excluded
          });
      }
      

      var persons = [];
      
      persons[0] = new Person();
      persons[1] = new Person();
      
      console.log(JSON.stringify(persons));  // [{"name":"Ted"},{"name":"Ted"}]
      

      【讨论】:

      • 由于我的无知,这只是一个一般性的问题......什么样的开发人员只支持 ECMAScript 5,他正在做什么样的事情?什么正在运行 ECMAScript 5 等?
      • @Allen:用于确保浏览器类型/版本的封闭环境的内部应用程序。或服务器端代码,尽管由于 OP 包含 jQuery 标记,这不太可能。 “什么正在运行 ECMAScript 5 等?” 如果您的意思是哪些环境支持 ES 5,请查看来自 Kangax 的 ES 5 compatibility table
      • 谢谢!在做了一些研究之后,我在发表上面的评论后看到了这张表 :) 看起来已经有很多浏览器实现了这些功能,非常令人兴奋!
      • 谢谢大家,我也可以使用类似的方法来忽略方法吗?在构造对象期间,我有一个对本地方法的函数调用,例如this.method() 这导致字符串化仍然混乱(循环对象值)
      • @Moz:该方法是在构造过程中使用的,还是它是构造函数的.prototype对象的成员。
      猜你喜欢
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 2023-03-17
      • 2014-05-11
      • 2018-12-22
      • 1970-01-01
      相关资源
      最近更新 更多