json是一種輕量級(jí)的數(shù)據(jù)格式焚刚,它不是編程語言濒蒋,更不從屬于JavaScriopt惕味。
json用法
1.與JavaScriopt不同的是楼誓,json字符串必須使用雙引號(hào),否則會(huì)報(bào)錯(cuò)名挥;
2.json的對(duì)象中的屬性需要用引號(hào)包裹疟羹;
3.json不需要聲明變量,因?yàn)閖son并不支持變量;
4.json的對(duì)象中阁猜,鍵值對(duì)與鍵值對(duì)之間用逗號(hào)分隔丸逸,而不是分號(hào)。
數(shù)據(jù)類型
json可支持三種數(shù)據(jù)類型:
- 簡單值:字符串類型剃袍、數(shù)字類型黄刚、布爾值、null民效;
- 數(shù)組:數(shù)組可以通過值的索引來訪問值憔维。數(shù)組的值可以是任意類型(簡單值、數(shù)組或?qū)ο?畏邢;
- 對(duì)象:對(duì)象由鍵值對(duì)構(gòu)成业扒,每個(gè)鍵值對(duì)的值可以是任意類型(簡單值、數(shù)組或?qū)ο?舒萎。
注:json不支持undefined程储、變量、函數(shù)或?qū)ο髮?shí)例
序列化與解析
json對(duì)象有兩個(gè)方法:stringify ( )與parse ( ) 臂寝。stringify ( )用于將js對(duì)象序列化為json字符串章鲤,而parse ( ) 用于將json字符串解析為js值。
舉個(gè)例子:
var book = {
title : "Professional JavaScriopt",
authors : ["Nicholas C. Zakas"],
edition : 3,
year : 2011
};<!--js對(duì)象-->
var jsonText = JSON.stringify (book);
<!--jsonText中保存的字符串是
{ "title" : "Professional JavaScriopt" , "authors" : ["Nicholas C. Zakas"] , "edition" : 3 , "year" : 2011}-->
var bookCopy = JSON.parse (jsonText);
上例中咆贬,雖然book與bookCopy 具有相同的值败徊,但它們兩個(gè)是彼此獨(dú)立的對(duì)象。
JSON.stringify ( )
JSON.stringify ( )方法可接收三個(gè)參數(shù):
- 需要序列化的js對(duì)象掏缎;
- 過濾器皱蹦,可以是數(shù)組或函數(shù);
- 用于序列化為json字符串時(shí)的縮進(jìn)(默認(rèn)情況下眷蜈,JSON.stringify ( )輸出的字符串不包括任何空字符串或縮進(jìn) )沪哺。
第二個(gè)參數(shù)為數(shù)組
舉個(gè)例子:
var book = {
title : "Professional JavaScriopt",
aurhors : ["Nicholas C. Zakas"],
edition : 3,
year : 2011
};<!--js對(duì)象-->
var jsonText = JSON.stringify (book , ["authors" , "year"]);
<!--jsonText中保存的字符串是
{ "authors" : ["Nicholas C. Zakas"] , "year" : 2011}-->
第二個(gè)參數(shù)為函數(shù)
當(dāng)stringify ( )方法的第二個(gè)參數(shù)傳入的是一個(gè)函數(shù)時(shí),該函數(shù)會(huì)接收兩個(gè)參數(shù):屬性名(鍵名)酌儒、屬性值凤粗,并返回一個(gè)值。
注:若某個(gè)鍵值對(duì)的值是undefined今豆,則該屬性將會(huì)被忽略嫌拣,不會(huì)被序列化。
舉個(gè)栗子:
var book = {
title : "Professional JavaScriopt",
aurhors : ["Nicholas C. Zakas"],
edition : 3,
year : 2011
};<!--js對(duì)象-->
var jsonText = JSON.stringify (book ,function(key , value){
switch(key){
case "authors" :
return value.join(",");
case "year" :
return 5000;
case "edition " :
return undefined;
default :
return value;
}
});
<!--jsonText 保存的json字符串為:
{ "title" : "Professional JavaScriopt" , "authors" : ["Nicholas C. Zakas"] , "year" : 2011}-->
第三個(gè)參數(shù)
該參數(shù)用于控制json字符串中的縮進(jìn)和空白符呆躲。
- 若參數(shù)是一個(gè)小于等于10的數(shù)字(最大縮進(jìn)空格數(shù)為10异逐,大于10的值將會(huì)被自動(dòng)轉(zhuǎn)換為10),則表示每級(jí)縮進(jìn)的空格數(shù)插掂;
- 若參數(shù)是一個(gè)字符串灰瞻、制表符等的非數(shù)值腥例,則該字符串、制表符等將被用作縮進(jìn)符酝润,同樣燎竖,字符串等不能超過10個(gè)字符。
toJSON ( )方法
舉個(gè)栗子:
var book = {
title : "Professional JavaScriopt",
aurhors : ["Nicholas C. Zakas"],
edition : 3,
year : 2011,
toJSON:function(){
return this.title;
}
};
var jsonText = JSON.stringify (book);
<!--jsonText保存的字符串為:
"Professional JavaScriopt"-->
序列化的順序
當(dāng)把一個(gè)js對(duì)象傳入JSON.stringify ( )時(shí)要销,序列化該對(duì)象的順序則是:
1.若存在toJSON ( )方法且能取得有效值构回,則調(diào)用該方法。否則疏咐,返回對(duì)象本身纤掸;例如:
var book = {
title : "Professional JavaScriopt",
authors : ["Nicholas C. Zakas"],
edition : 3,
year : 2011
};<!--js對(duì)象-->
var jsonText = JSON.stringify (book);
<!--當(dāng)js對(duì)象中并不存在toJSON ( )方法或無法取得有效值(值為undefined等情況)時(shí),這一步返回的就是book對(duì)象-->
2.如果提供了第二個(gè)參數(shù)浑塞,則應(yīng)用該過濾器借跪。注:傳入過濾器的值是第1步返回的值
3.對(duì)第2步返回的每個(gè)值進(jìn)行相應(yīng)的序列化。
4.如果提供了第三個(gè)參數(shù)酌壕,則執(zhí)行掏愁。
JSON.parse ( )
JSON.parse ( )可以接收兩個(gè)參數(shù):
- 需要解析的json字符串;
- 還原函數(shù)卵牍;
還原函數(shù)同過濾函數(shù)一樣果港,可以接收兩個(gè)參數(shù):key、value辽慕,并返回一個(gè)值。若返回的是undefined赦肃,則表示要從結(jié)果中刪除相對(duì)應(yīng)的鍵溅蛉。
舉個(gè)栗子:
var book = {
title : "Professional JavaScriopt",
authors : ["Nicholas C. Zakas"],
edition : 3,
year : 2011,
releaseDate : new Date(2018,12,12)
};
var jsonText = JSON.stringify (book);
var bookCopy=JSON.parse(jsonText,function(key,value){
if(key=="releaseDate"){
return new Date(value);
}else{
return value;
}
});
alert(bookCopy.releaseDate.getFullYear());