簡體   English   中英

toJSON()和JSON.Stringify()之間的區別

[英]Difference between toJSON() and JSON.Stringify()

如果需要讀取或克隆模型的所有數據屬性,請使用其toJSON()方法。 此方法將屬性的副本作為對象返回(盡管名稱不是JSON字符串)。 (當JSON.stringify()傳遞一個帶有toJSON()方法的對象時,它會將toJSON()的返回值字符串化而不是原始對象。上一節中的示例在調用JSON.stringify時利用了此功能。 ()記錄模型實例。)

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

任何人都可以告訴我這兩種以JSON表示法representing an object方式之間的區別。 我只是困惑這些是否實現相同或存在差異。

精細手冊

toJSON行為

如果要進行字符串化的對象具有名為toJSON的屬性,其值為函數,則toJSON方法自定義JSON字符串化行為:而不是被序列化的對象,調用時toJSON方法返回的值將被序列化。

這就是Backbone使用toJSON方法進行序列化並給出一個名為m的模型實例的原因,你可以說:

var string = JSON.stringify(m);

並獲得m的屬性,而不是服務器不關心的一堆噪音。

也就是說,主要區別在於toJSON生成一個值(數字,布爾值,對象,...),它轉換為JSON字符串,而JSON.stringify總是生成一個字符串。

默認的Backbone toJSON就是這個(對於模型):

return _.clone(this.attributes);

所以m.toJSON()為您提供了模型屬性的淺表副本。 如果有數組或對象作為屬性值,那么您將結束意外的參考共享。 請注意, Backbone.Model#clone也會遇到此問題

如果您想安全地克隆模型的數據,那么您可以通過JSON.stringifyJSON.parse發送它以獲得深層副本:

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

其中model_instance是Backbone模型M實例。

  • JSON.stringify() - 可以對任何有效的JSON表示值進行字符串化。

    JSON.stringify(..)實用程序會在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 od = 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}" 

我也在閱讀Addy Osmani的開發backbone.js應用程序 ,我也有同樣的問題。 我通過在控制台中嘗試他的示例(待辦事項列表)來弄清楚。

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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM