【问题标题】:Difference between toJSON() and JSON.Stringify()toJSON() 和 JSON.Stringify() 之间的区别
【发布时间】:2014-01-11 03:52:47
【问题描述】:

如果您需要读取或克隆模型的所有数据属性,请使用其 toJSON() 方法。此方法返回属性的副本作为 对象(尽管它的名称不是 JSON 字符串)。 (当 JSON.stringify() 是 使用 toJSON() 方法传递了一个对象,它将返回字符串化 toJSON() 的值而不是原始对象。中的例子 上一节在他们调用时利用了此功能 JSON.stringify() 记录模型实例。)

http://addyosmani.github.io/backbone-fundamentals/#backbone-basics

谁能告诉我representing an object 这两种方式在JSON 符号中的区别。我只是很困惑这些是实现相同还是有区别。

【问题讨论】:

  • @Pekka웃:我试过了,但没有得到任何好的结果。 google.co.in/…
  • 我相信toJSON() 返回一个值,JSON.stringify() 然后可以将其转换为 JSON 文本。我相信这在使用 Date 对象之类的东西时很方便。这是我记得读过的内容。
  • @MatthewPaxman:有点。 JSON.stringify 将调用 toJSON 本身来计算对象的 JSON 表示。
  • @Pekka웃 是的,谷歌搜索应该会引导你到 StackOverflow 问题:)

标签: javascript json backbone.js


【解决方案1】:

来自fine manual

toJSON 行为

如果一个被字符串化的对象有一个名为toJSON的属性,它的值是一个函数,那么toJSON方法自定义JSON字符串化行为:而不是被序列化的对象,调用时toJSON方法返回的值将被序列化。

这就是为什么 Backbone 使用toJSON 方法进行序列化并给定一个名为m 的模型实例,您可以这样说:

var string = JSON.stringify(m);

只从m 中获取属性,而不是你的服务器不会关心的一堆噪音。

也就是说,主要区别在于 toJSON 生成的值(数字、布尔值、对象...)会被转换为 JSON 字符串,而 JSON.stringify 总是生成字符串。

default Backbone toJSON 就是这个(对于模型):

return _.clone(this.attributes);

所以m.toJSON() 为您提供模型属性的 副本。如果有数组或对象作为属性值,那么您将结束意外的引用共享。请注意Backbone.Model#clone 也是suffers from this problem

如果您想安全地克隆模型的数据,您可以通过JSON.stringify 发送它,然后通过JSON.parse 获取深层副本:

var data         = JSON.parse(JSON.stringify(model_instance));
var cloned_model = new M(data);

其中model_instance 是您的主干模型M 的实例。

【讨论】:

    【解决方案2】:
    • JSON.stringify() - 任何有效的 JSON 表示值都可以被字符串化。

      JSON.stringify(..) 实用程序会在遇到 undefinedfunctionsymbol 值时自动忽略它们。如果在 array 中找到这样的值,则该值将替换为 null(这样数组位置信息就不会改变)。如果作为 object 的属性被发现,该属性将被排除在外。

      JSON 字符串化具有特殊行为,如果 object 值定义了 toJSON() 方法,则会首先调用此方法以获取用于序列化的值。

    • toJSON() - 转换为适合字符串化的有效 JSON 值。

      例如,JSON.stringify()object 中带有循环引用,将引发错误。 toJSON() 可以修复如下。

      var o = { };
      var a = {
          b: 32,
          c: o
      };
      
      // circular reference
      o.d = a;
      
      // JSON.stringify( a ); // an error caused by circular reference
      
      // define toJSON method
      a.toJSON = function() {
           return { b: this.b };
      };
      
      JSON.stringify( a ); // "{"b":32}"
      

    【讨论】:

    • 你如何修复一个类的实例,当输入到 stringify 时会显示为 {}
    【解决方案3】:

    我也在阅读 Addy Osmani 的 Developing backbone.js application,我也有同样的问题。我在控制台中尝试了他的示例(待办事项列表)。

    var Todo = Backbone.Model.extend({
        defaults:{
             title:"",
             completed:false
    }
    });
    
    var todo1 = new Todo(); 
    
    
    console.log(todo1.toJSON())
    //The console shows
    //Object {title: "finish your assignment", completed: false}
    
    console.log(JSON.stringify(todo1))
    //The console shows
    //{"title":"finish your assignment","completed":false}
    

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 2015-10-23
      • 2021-12-25
      • 2020-05-10
      • 2014-09-20
      相关资源
      最近更新 更多