JSON與XML都是結(jié)構(gòu)化數(shù)據(jù)的表現(xiàn)方式收奔。
回憶一下XML掌呜,
1、創(chuàng)建xml 文檔對(duì)象坪哄,用來存放加載xml文檔质蕉,或解析字符串后的結(jié)果。
2翩肌、將XML字符串解析模暗,即將xml字符串解析成為XML DOM文檔,對(duì)文檔內(nèi)容的訪問與修改還需要使用DOM方法念祭。
3兑宇、將xml DOM文檔序列化為xml字符串。
JSON呢粱坤?
JSON(JavaScript Object Notation:js對(duì)象表示法)利用javascript中的一些模式隶糕,來表示結(jié)構(gòu)化的數(shù)據(jù)。不是一門編程語言站玄,只是一種數(shù)據(jù)格式枚驻。也并不是只有js才使用JSON,很多編程語言都有針對(duì)JSON這種數(shù)據(jù)的格式的解析器和序列化器株旷。
[
{
"title":"a",
"num":1,
"height":178
},
{
"title":"b",
"num":2,
"height":188
},
{
"title":"c",
"num":3,
"height":198
}
]
上面這種表示方法测秸,很眼熟,當(dāng)我們以對(duì)象字面量的表示法創(chuàng)建對(duì)象灾常,或者數(shù)組的時(shí)候就是這樣,不同的是铃拇,每個(gè)鍵值都被雙引號(hào)括起來钞瀑,例如"num":1
。且沒有分號(hào)結(jié)尾慷荔。
JSON語法
JSON語法是js語法的一部分雕什,JSON語法可以表示以下三種類型的值,簡單值:可以在json中表示字符串显晶、數(shù)值贷岸、布爾值和null,但是不能表示undefined磷雇。
對(duì)象:無序的鍵值對(duì)偿警,例如上面展示的數(shù)組里的每一個(gè)對(duì)象。
數(shù)組:有序的值的列表唯笙。
最常用的json數(shù)據(jù)格式就是上面粘的那段代碼螟蒸。
觀察盒使,會(huì)發(fā)現(xiàn)json并沒有聲明變量的語句,所以通過加載json文件或者解析json格式的字符串生成一個(gè)js對(duì)象七嫌,可以將結(jié)果賦給一個(gè)變量少办,然后通過該變量,以js語法的格式訪問诵原。對(duì)比xml要解析成dom文檔英妓,要簡單的多。解析以及序列化
-
解析
- 解析加載的.json文件
這個(gè)需要等到學(xué)習(xí)ajax時(shí)候才可以了解绍赛。 - 解析json格式的字符串
- 早期的JSON解析器就是使用eval()函數(shù)蔓纠,來解析解釋返回javascript對(duì)象和數(shù)組。但是這個(gè)方法不那么安全惹资,可能會(huì)執(zhí)行一些惡意代碼贺纲。
var json='[{"title":"a","num":1},{"title":"b","num":2}]';
alert(typeof json);//string
var box=eval(json);
alert(typeof box);//object - 全局對(duì)象:JSON,該對(duì)象有兩個(gè)方法褪测,分別用來解析以及序列化猴誊。
但是只有IE8+、Firefox3.5+侮措、Safari4+懈叹、chrome、Opera10.5+支持分扎。對(duì)于較早的版本可以在加載一個(gè)外部文件:json.js澄成,來新建一個(gè)JSON對(duì)象(去網(wǎng)上下載)。
var json='[{"title":"a","num":1},{"title":"b","num":2}]';
var box=JSON.parse(json);
alert(box[0].num);//1
該方法還接受一個(gè)參數(shù)畏吓,該參數(shù)是一個(gè)函數(shù)墨状,將在每個(gè)鍵值對(duì)上調(diào)用。
var json='[{"title":"a","num":1},{"title":"b","num":2}]';
var box=JSON.parse(json,function(key,value){
switch (key){
case "title":
return "Miss "+value;
case "num":
return value;
default :
return value
}
});
alert(box[0].title)//Miss a
- 早期的JSON解析器就是使用eval()函數(shù)蔓纠,來解析解釋返回javascript對(duì)象和數(shù)組。但是這個(gè)方法不那么安全惹资,可能會(huì)執(zhí)行一些惡意代碼贺纲。
- 解析加載的.json文件
-
序列化
var json='[{"title":"a","num":1},{"title":"b","num":2}]';
var box=JSON.parse(json);
alert(JSON.stringify(box)); //打印字符串
事實(shí)上菲饼,JSON的方法stringfy還有其他的參數(shù)肾砂,第一個(gè)餐宿是一個(gè)過濾器,可以是一個(gè)數(shù)組宏悦,也可以是一個(gè)我函數(shù)镐确,第二個(gè)參數(shù)是一個(gè)選項(xiàng),表示是否在json字符串中保留縮進(jìn)饼煞。單獨(dú)或組合使用均可以源葫。第一個(gè)參數(shù)
【如果是數(shù)組】JSON.stringify()將只包含數(shù)組中列出的選項(xiàng)。
var json='[{"title":"a","num":1,"height":177},{"title":"b","num":2,"height":188}]';
var box=JSON.parse(json);
alert(JSON.stringify(box,['num',"height"]));//[{"num":1,"height":177},{"num":2,"height":188}]
【如果是函數(shù)】函數(shù)的第一個(gè)參數(shù)key表示鍵值砖瞧,第二個(gè)參數(shù)value表示鍵值對(duì)應(yīng)的屬性
var json='[{"title":"a","num":1,"height":177},{"title":"b","num":2,"height":188}]';
var box=JSON.parse(json);
var jsontext=JSON.stringify(box,function(key,value){
switch(key){
case "title":
return "《"+value+"》";
case "num":
return 0;
case "height":
return value;
default:
return value;
}
});
alert(jsontext)第二個(gè)參數(shù)用于控制結(jié)果中的縮進(jìn)和空白符息堂。可以是數(shù)值芭届,代表縮進(jìn)的空格數(shù)储矩,如果是字符感耙,代表縮進(jìn)填充的字符
var json='[{"title":"a","num":1},{"title":"b","num":2}]';
var box=JSON.parse(json);
alert(JSON.stringify(box,null,4));
如果第三個(gè)參數(shù)需要,但第二個(gè)參數(shù)不需要持隧,就直接傳一個(gè)null就可以即硼。toJSON()方法
可以為任何對(duì)象添加這個(gè)方法,當(dāng)把該對(duì)象作為參數(shù)殘遞給JSON.stringify()時(shí)屡拨,會(huì)自動(dòng)調(diào)用toJSON這個(gè)方法只酥,并將該方法放回的對(duì)象進(jìn)行序列化。
var json=[
{
title:'a',
num:1,
height:177,
toJSON:function(){
return {title:this.title,num:this.num};
}
},
{
title:'b',
num:2,
height:177,
toJSON:function(){
return {title:this.title,num:this.num};
}
},
{
title:'c',
num:3,
height:177,
toJSON:function(){
return {title:this.title,num:this.num};
}
}
];
var jsontext=JSON.stringify(json);
alert(jsontext)
還必須額外了解一下呀狼,序列化該對(duì)象的順序裂允。如果存在該方法,那么優(yōu)先執(zhí)行該方法哥艇,如果還存在過濾器參數(shù)绝编,那么在對(duì)該方法返回的結(jié)果進(jìn)行過濾。