ECMAscript 的全局對象----JSON

JSON.stringify(), 將value(Object,Array,String,Number...)序列化爲JSON字符串
    JSON.parse(), 將JSON數據解析爲js原生值
    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_r() 也能夠解析 並返回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) 若是提供了第三個參數,執行相應的格式化操做。
相關文章
相關標籤/搜索