JSON.stringify(),JSON.parse(),toJSON()方法使用-20 chapter


筆記

  1. JSON.stringify(), 將value(Object,Array,String,Number...)序列化為JSON字符串
  2. JSON.parse(), 將JSON數據解析為js原生值
  3. toJSON(), 作為JSON.stringify中第二個參數(函數過濾器)補充

支持 IE8+,FF3.5+,safari4+,opera10.5+,chrome

	/*
	 * ===================ECMAscript5 全局對象JSON=====================
	 * Json:只是一種輕量級的數據格式。使用js syntax的子集表示對象、數組、字符串、數值、布爾值、和null
	 * Note:ECMAScript5 定義了一個原生的JSON對象,
	 		用來將對象序列化為JSON字符串(JSON.stringify()),
	 		或者將JSON數據解析為js對象(JSON.parse())。
	 * support: IE8+,FF3.5+,safari4+,opera10.5+,chrome
	 * IE6,7 : https://github.com/douglascrockford/JSON-js
	*/

	/*
	 * JSON.stringify()
	 * @specify : serialization(序列化)
	 * @method : JSON.stringify(value,filter,indent);
	 * @return : JSON字符串

	 * @param : value {type : String|Object|String|Number|Boolean|null} {explain : 傳入的類型可以是列出的這些}
	 * @param : filter : {type : []|{}}	{explain : 過濾器可以是個數組,也可以是個函數}
	 * @param : indent : {type : Number | 特殊符號} {explain : 如果是數字則代表空白符的個數,最多10個;也可以直接傳入縮進的符號}
	*/
	var gather = {
		id : 1314,
		name : 'pom',
		infor : {
			age : 20,
			sex : 'man',
			marry : false,
			identity : 622421,
			habit : ['籃球','台球','乒乓球','游戲',true]
		},
		family : ['媽媽','爸爸','弟弟'],
		likeGames : ['PCgame','Netgame']

	};
	var jsonText = JSON.stringify(gather,null,4);

	//第二個參數是數組,只會序列化返回數組里列出的名稱
	var jsonText1 = JSON.stringify(gather,['id','family'],'=');

	var jsonText2 = JSON.stringify(gather,function(key,val){
		switch(key){
			case 'id' :
				return 'id is ' + val;
			case 'family' :
				return val.join('@');
			case 'infor' :
				//infor的val 還可以使用JSON.stringify()
				//return JSON.stringify(val,["age","sex"]);
				return Object.prototype.toString.call(val).slice(8, -1);
			case 'likeGames' :
				//通過返回undefined刪除該屬性
				return undefined;
			//一定要default,以便傳入的其他值能正常的返回到序列化結果中。
			default :
				return val;
		}
	},10);
	// console.log(jsonText);
	// console.log(jsonText1);
	// console.log(jsonText2)

	/*
	 * toJSON()
	 * @specify : JSON.stringify()不能滿足對某些對象進行自定義序列化的需求,可以通過對象那個上調用toJSON()方法
	 * @method : date.toJSON()
	 * @return : 返回任何序列化的值。
	 * 
	 * JSON.parse() ,eval() 也可以解析 並返回js對象和數組等。但IE8以下瀏覽器會有安全隱患。
	 * @specify : 將json字符串解析為原生的javascript值。
	 * @method : JSON.parse(val,replacer)

	 * @param : val{type : String} {explain : 需要解析的json字符串}
	 * @param : replacer {type : function} 
	 					 {explain : 和JSON.stringify()第二個參數類似,接受2個參數,key,val,不過是用來還原json串的函數}

	*/
	var products = {
		name : "leading",
		"time" : new Date(2012,03,1),
		toJSON : function(){
			//只返回name
			return this.name;
		}
	}
	var proStr = JSON.stringify(products);
	console.log(proStr);

	//obj中的relaeseDate對象序列化之后成了有效的json串
	var obj = {
		title : '對象的標題',
		type : 'primitive' ,
		releaseDate : new Date(2012,03,1)
	};
	//轉化為json串
	var o = JSON.stringify(obj);
	console.log(o);

	//在parsedO中還原為一個Date對象(會基於相應的值創建一個新的Date對象,結果parsedO.releaseDate屬性中保存了一個Date對象)
	var parsedO = JSON.parse(o,function(k,v){
		if(k == 'releaseDate'){
			return new Date(v);
		}else{
			return v;
		}
	});
	console.log(parsedO);
	//可以調用getFullYear()
	console.log(parsedO.releaseDate.getFullYear());	//2012

 執行原理:

    /*
     * toJSON() 作為JSON.stringify中第二個參數(函數過濾器)補充,理解內部順序很重要。
     * 假設把一個對象傳入JSON.stringify() 序列化對象的順序如下:
     *
     * (1) 如果存在toJSON()方法而且能通過它取得有效的值,則調用該方法。否則,按默認順序執行序列化
     * (2) 如果提供了第二個參數,應用這個函數過濾器,傳入的函數過濾器的值是第(1)步返回的值。
     * (3) 對第(2)步 返回的每個值進行相應的序列化。
     * (4) 如果提供了第三個參數,執行相應的格式化操作。
    */

 

 

自己寫的筆記,也不知道邏輯正確與否...語言表達能力,溝通能力逐漸退化。

所以筆記還得經常寫。

mark :《高程三》 20章 閱讀記錄。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM