toJSON()和JSON.Stringify()之间的区别

时间:2013-12-22 22:50:20

标签: javascript json backbone.js

  

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

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

任何人都可以告诉我representing an object符号JSON的这两种方式之间的区别。我很困惑这些是否达到相同或存在差异。

3 个答案:

答案 0 :(得分:51)

来自fine manual

  

toJSON行为

     

如果要进行字符串化的对象具有名为toJSON的属性,其值为函数,则toJSON方法会自定义JSON字符串化行为:而不是要序列化的对象,{{返回的值} 1}}调用时的方法将被序列化。

这就是Backbone使用toJSON方法进行序列化并给出名为toJSON的模型实例的原因,您可以这样说:

m

并获取var string = JSON.stringify(m); 以外的属性,而不是服务器不关心的一堆噪音。

也就是说,主要区别在于m生成一个值(数字,布尔值,对象,......)转换为JSON字符串,而toJSON总是生成一个字符串。 / p>

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

JSON.stringify

因此return _.clone(this.attributes); 会为您提供模型属性的副本。如果有数组或对象作为属性值,那么您将结束意外的参考共享。请注意,Backbone.Model#clone也是suffers from this problem

如果您想要安全地克隆模型的数据,那么您可以通过m.toJSON()然后JSON.stringify发送它以获得深层副本:

JSON.parse

其中var data = JSON.parse(JSON.stringify(model_instance)); var cloned_model = new M(data); 是您的Backbone模型model_instance的实例。

答案 1 :(得分:9)

  • 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}"
    

答案 2 :(得分:2)

我也在读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}