一体谒、JSON格式
JSON格式(JavaScript Object Notation)是一種用于數(shù)據(jù)交換的文本格式关拒,2001年由 道格拉斯 克羅克福德(Douglas Crockford)提出,目的是取代繁瑣笨重XML格式。
相比XML格式,JSON格式有兩個(gè)顯著優(yōu)點(diǎn):書寫簡單,一目了然饼灿;符合JS原生語法,JS引擎可直接解析帝美,不用另外添加解析代碼碍彭。所以,JSON迅速被接受悼潭,已經(jīng)成為各大網(wǎng)站交換數(shù)據(jù)的標(biāo)準(zhǔn)格式庇忌,并被寫入ES5,成為了標(biāo)準(zhǔn)的一部分舰褪。
每個(gè)JSON代表一個(gè)值皆疹,要么是簡單類型的值,要么是復(fù)合類型的值占拍,但是只能是一個(gè)值略就,不能是兩個(gè)或更多的值捎迫。這就是說,每個(gè)JSON文檔只能包含一個(gè)值表牢。
JSON對(duì)值得類型和格式規(guī)定(牢記):
- 復(fù)合類型的值只能是數(shù)組或?qū)ο笳蓿荒苁呛瘮?shù)、正則表達(dá)式對(duì)象崔兴、日期對(duì)象彰导。
簡單類型的值只有四種:字符串、數(shù)值(必須以十進(jìn)制表示)敲茄、布爾值和null(不能使用
NaN
,Infinity
,-Infinity
和undefined
)位谋。字符串必須使用雙引號(hào)表示,不能使用單引號(hào)堰燎。
對(duì)象的鍵名必須放在雙引號(hào)里面掏父。
數(shù)組或?qū)ο笞詈笠粋€(gè)成員的后面,不能加逗號(hào)秆剪。
ES5新增了JSON對(duì)象损同,用來處理JSON格式的數(shù)據(jù),它有兩個(gè)方法:
JSON.stringify()
和JSON.parse()
鸟款。
二、JSON.stringify()茂卦,[將JS值序列化為JS字符串何什,該字符串內(nèi)容要符合JSON格式]
用于將一個(gè)JS值序列化為一個(gè)字符串,這個(gè)JS字符串內(nèi)容應(yīng)該符合JSON格式等龙,并且可以被
JSON.parse()
還原处渣。
2.1、修改MDN上對(duì)這個(gè)概念的翻譯:
原翻譯并不是很直觀蛛砰,容易讓初學(xué)者產(chǎn)生誤解罐栈。
2.2、示例:
JSON.stringify('abc') // ""abc"" JS字符串里面的"abc"是符合JSON格式的字符串
JSON.stringify(1) // "1" JS字符串里面的1是符合JSON格式的數(shù)值
JSON.stringify(false) // "false"
JSON.stringify([]) // "[]"
JSON.stringify({}) // "{}"
JSON.stringify([1, "false", false]) // '[1,"false",false]'
JSON.stringify({ name: "張三" }) // '{"name":"張三"}'
上面代碼將各種類型的值泥畅,轉(zhuǎn)成JSON字符串荠诬。需要注意的是,對(duì)于原始類型的字符串位仁,轉(zhuǎn)換結(jié)果會(huì)帶雙引號(hào)柑贞,即字符串abc
會(huì)被轉(zhuǎn)成"abc"
,這是因?yàn)閷磉€原的時(shí)候聂抢,雙引號(hào)可以讓JS引擎知道钧嘶,abc
是一個(gè)字符串,而不是一個(gè)變量名琳疏。
如果原始對(duì)象中有决,有一個(gè)成員是undefined
闸拿、函數(shù)或XML對(duì)象,這個(gè)成員會(huì)被省略书幕。如果數(shù)組的成員是undefined
新荤、函數(shù)或XML對(duì)象,則這些值被轉(zhuǎn)成null
按咒。
JSON.stringify({
f: function(){},
a: [ function(){}, undefined ]
});
// "{"a": [null,null]}"
上面代碼中迟隅,原始對(duì)象的f
屬性是一個(gè)函數(shù),JSON.stringify
方法返回的字符串會(huì)將這個(gè)屬性省略励七。而a
屬性是一個(gè)空數(shù)組智袭,成員分別是函數(shù)和undefined
,它們都被轉(zhuǎn)成了null
掠抬。
正則對(duì)象會(huì)被轉(zhuǎn)成空對(duì)象吼野。
JSON.stringify(/foo/) // "{}"
JSON.stringify
方法會(huì)忽略對(duì)象的不可遍歷屬性。
var obj = {};
Object.defineProperties(obj, {
'foo': {
value: 1,
enumerable: true
},
'bar': {
value: 2,
enumerable: false
}
});
JSON.stringify(obj); // {"foo":1}
上面代碼中两波,bar
是obj
對(duì)象的不可遍歷屬性瞳步,JSON.stringify
方法會(huì)忽略這個(gè)屬性。
2.3腰奋、第二個(gè)參數(shù)
2.3.1单起、JSON.stringify
方法可以接受一個(gè)數(shù)組,作為第二個(gè)參數(shù)劣坊,指定需要轉(zhuǎn)成字符串的屬性嘀倒。
var obj = {
prop1: 'value1',
prop2: 'value2',
prop3: 'value3'
};
var selectedProperties = ['prop1', 'prop2'];
JSON.stringify(obj, selectedProperties);
上面代碼中,JSON.stringify
方法得第二個(gè)參數(shù)指定局冰,只轉(zhuǎn)prop1
和prop2
兩個(gè)屬性测蘑。
如果要序列化的是一個(gè)數(shù)組,那第二個(gè)參數(shù)就無效:
JSON.stringify(["a", "b"], ['0']);
JSON.stringify({a: "huahua", b: 23}, ['0']);
2.3.2康二、第二個(gè)參數(shù)還可以是一個(gè)函數(shù)碳胳,用來更改JSON.stringify
的默認(rèn)行為。
function f(key, value) {
if (typeof value === "number") {
value = 2 * value;
}
return value;
}
JSON.stringify({ a: 1, b: 2 }, f);
// '{"a": 2,"b": 4}'
上面代碼中的f
函數(shù)沫勿,接受兩個(gè)參數(shù)挨约,分別是被轉(zhuǎn)換的對(duì)象的鍵名和鍵值。如果鍵值是數(shù)值产雹,就將它乘以2烫罩,否則就原樣返回。
2.4洽故、第三個(gè)參數(shù)
默認(rèn)情況下該方法輸出的字符串不包含任何空格字符或縮進(jìn)贝攒,所以有了第三個(gè)可選的參數(shù)。
這個(gè)參數(shù)用于增加返回的JSON語法的字符串的可讀性时甚。如果是數(shù)字隘弊,表示每個(gè)屬性前面添加的空格(最多不超過10個(gè))哈踱;如果是字符串(不超過10個(gè)字符),則該字符串會(huì)添加在每行前面梨熙。
JSON.stringify({ p1: 1, p2: 2 }, null, 2);
/*
"{
"p1": 1,
"p2": 2
}"
*/
JSON.stringify({ p1:1, p2:2 }, null, '|-');
/*
"{
|-"p1": 1,
|-"p2": 2
}"
*/
2.5开镣、toJSON方法
如果JSON.stringify
的參數(shù)對(duì)象有自定義的toJSON
方法,那么JSON.stringify
會(huì)使用這個(gè)方法的返回值作為參數(shù)咽扇,而忽略原對(duì)象的其他屬性邪财。
三、JSON.parse()质欲,[將字符串變成值]
將一個(gè)符合JSON語法的字符串(注意理解树埠,不是JSON字符串)解析成一個(gè)對(duì)應(yīng)類型的值或?qū)ο蟆?/p>
3.1、MDN中對(duì)這個(gè)方法的翻譯做了修改嘶伟,如下:
-
原來的翻譯:
-
修改后的翻譯:
3.2怎憋、示例:
JSON.parse('{}'); // {}
JSON.parse('true'); // true
JSON.parse(' "foo" '); // "foo" 注意理解,"foo"是一個(gè)JSON字符串九昧,'"foo"'是符合JSON語法的字符串
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null'); // null
如果傳入的字符串不是有效的JSON格式绊袋,JSON.parse
方法將報(bào)錯(cuò)。
JSON.parse("'String'") // illegal single quotes
// SyntaxError: Unexpected token ILLEGAL
上面代碼中铸鹰,雙引號(hào)字符串中是一個(gè)單引號(hào)字符串癌别,因?yàn)閱我?hào)字符串不符合JSON格式,所以報(bào)錯(cuò)蹋笼。
JSON.parse
方法可以接受一個(gè)處理函數(shù)展姐,用法與JSON.stringify
方法類似。
(本系列完結(jié))