20.1 語(yǔ)法
JSON的語(yǔ)法可以表示一下三種類型的值。
簡(jiǎn)單值:與JavaScript相同俐末,可以表示字符串,數(shù)值奄侠,布爾值和null卓箫,但不支持特殊值undefined。
對(duì)象:無(wú)需鍵值對(duì)垄潮。
數(shù)組:有序值的列表烹卒。
JSON不支持變量,函數(shù)或?qū)ο髮?shí)例弯洗,僅是一種表示結(jié)構(gòu)化數(shù)據(jù)的格式甫题。
20.1.1 簡(jiǎn)單值
JSON表示字符串時(shí)必須用雙引號(hào),單引號(hào)會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤涂召。其他簡(jiǎn)單值表示與JavaScript相同。
20.1.2 對(duì)象和數(shù)組
JSON中對(duì)象的屬性名稱要加雙引號(hào)敏沉。JSON對(duì)象沒(méi)有聲明變量果正,沒(méi)有末尾分號(hào)炎码,同一個(gè)對(duì)象不能出現(xiàn)兩個(gè)同名屬性。JSON數(shù)組的語(yǔ)法與JavaScript相同秋泳,但同樣也沒(méi)有變量和分號(hào)潦闲。
20.2 解析與序列化
20.2.1 序列化
JSON對(duì)象的stringify()方法用于將JavaScript對(duì)象序列化為JSON字符串。默認(rèn)情況下迫皱,輸出的JSON字符串不包含任何空格字符或縮進(jìn)歉闰。所有函數(shù)及原型都會(huì)被有意忽略,值為undefined的任何屬性也都會(huì)被跳過(guò)卓起。
var obj = {
x:"a",
y:"b",
z:{
z1:[1,2,3],
z2:"z2"
},
u:undefined,
f:function () {
return this.x;
}
};
console.log(JSON.stringify(obj)); // {"x":"a","y":"b","z":{"z1":[1,2,3],"z2":"z2"}}
JSON.stringify()方法第二個(gè)參數(shù)可以是一個(gè)數(shù)組或方法和敬,為數(shù)組時(shí),序列化的結(jié)果將只包含數(shù)組中列出的屬性昼弟。
console.log(JSON.stringify(obj,["x","y"])); // {"x":"a","y":"b"}
第二個(gè)參數(shù)為方法時(shí),接收兩個(gè)參數(shù)奕筐,一個(gè)是屬性名舱痘,一個(gè)是屬性值,可以在方法中對(duì)屬性進(jìn)行操作离赫,根據(jù)函數(shù)的返回值改變序列化的結(jié)果芭逝。返回值為undefined的項(xiàng)會(huì)被忽略。
console.log(JSON.stringify(obj,function (key, value) {
console.log(value);
return value;
}));
JSON.stringify()方法第三個(gè)參數(shù)是用于控制縮進(jìn)和空白符渊胸,如果這個(gè)參數(shù)是一個(gè)數(shù)值旬盯,則表示每個(gè)級(jí)別縮進(jìn)的空格數(shù)〉潘ⅲ縮進(jìn)值最大為10瓢捉。
console.log(JSON.stringify(obj,null,4));
/*
{
"x": "a",
"y": "b",
"z": {
"z1": [
1,
2,
3
],
"z2": "z2"
}
}
*/
當(dāng)縮進(jìn)參數(shù)為一個(gè)字符串時(shí),將用這個(gè)字符串來(lái)當(dāng)做縮進(jìn)符办成。
console.log(JSON.stringify(obj,null,"----"));
/*
{
----"x": "a",
----"y": "b",
----"z": {
--------"z1": [
------------1,
------------2,
------------3
--------],
--------"z2": "z2"
----}
}
*/
當(dāng)對(duì)象上有toJSON()方法時(shí)泡态,在序列化的時(shí)候會(huì)執(zhí)行toJSON()方法來(lái)返回序列化結(jié)果。
var obj = {
x:"a",
y:"b",
z:{
z1:[1,2,3],
z2:"z2"
},
u:undefined,
f:function () {
return this.x;
},
toJSON:function () {
return 0;
}
};
console.log(JSON.stringify(obj)); // 0
20.2.2 解析
JSON.parse()方法用于將JSON字符串解析為JavaScript對(duì)象迂卢。同樣接收一個(gè)用于操作解析的方法作為參數(shù)某弦。與序列化方法的第二個(gè)參數(shù)相同,這個(gè)解析方法接收兩個(gè)參數(shù)一個(gè)是屬性名而克,一個(gè)是屬性值靶壮,可以在方法內(nèi)對(duì)每一項(xiàng)進(jìn)行操作,根據(jù)返回值改變解析的結(jié)果员萍。
var obj = {
x:"a",
y:"b",
z:{
z1:[1,2,3],
z2:"z2"
},
u:undefined,
f:function () {
return this.x;
}
};
var jsonObj = JSON.stringify(obj);
console.log(JSON.parse(jsonObj,function (key, value) {
if(key==="x"){
value +=1;
}
return value;
})); // {x: "a1", y: "b", z: {…}}