JS標(biāo)準(zhǔn)庫系列(七)—— JSON對(duì)象

一体谒、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, -Infinityundefined)位谋。

  • 字符串必須使用雙引號(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)生誤解罐栈。


修訂MDN上的內(nèi)容
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}

上面代碼中两波,barobj對(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)prop1prop2兩個(gè)屬性测蘑。

指定要被序列化的屬性名

如果要序列化的是一個(gè)數(shù)組,那第二個(gè)參數(shù)就無效:

JSON.stringify(["a", "b"], ['0']);
JSON.stringify({a: "huahua", b: 23}, ['0']);
只能對(duì)屬性有效
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é))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姓建,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缤苫,更是在濱河造成了極大的恐慌速兔,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件活玲,死亡現(xiàn)場(chǎng)離奇詭異涣狗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)舒憾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門镀钓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人镀迂,你說我怎么就攤上這事丁溅。” “怎么了探遵?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵窟赏,是天一觀的道長妓柜。 經(jīng)常有香客問我,道長涯穷,這世上最難降的妖魔是什么棍掐? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮拷况,結(jié)果婚禮上作煌,老公的妹妹穿的比我還像新娘。我一直安慰自己赚瘦,他們只是感情好粟誓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚤告,像睡著了一般努酸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上杜恰,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天获诈,我揣著相機(jī)與錄音,去河邊找鬼心褐。 笑死舔涎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逗爹。 我是一名探鬼主播亡嫌,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼掘而!你這毒婦竟也來了挟冠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤袍睡,失蹤者是張志新(化名)和其女友劉穎知染,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斑胜,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡控淡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了止潘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掺炭。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖凭戴,靈堂內(nèi)的尸體忽然破棺而出涧狮,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布勋篓,位于F島的核電站吧享,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏譬嚣。R本人自食惡果不足惜钢颂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拜银。 院中可真熱鬧殊鞭,春花似錦、人聲如沸尼桶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泵督。三九已至趾盐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間小腊,已是汗流浹背救鲤。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秩冈,地道東北人本缠。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像入问,于是被迫代替她去往敵國和親丹锹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 參考基礎(chǔ)教程的整理芬失,方便記憶 一楣黍、Object對(duì)象 (O大寫) 所有其他對(duì)象都繼承自這個(gè)對(duì)象。Object本身也是...
    Viaphlyn閱讀 2,316評(píng)論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理棱烂,服務(wù)發(fā)現(xiàn)租漂,斷路器,智...
    卡卡羅2017閱讀 134,638評(píng)論 18 139
  • 一棵樹倒了 倒地的聲音很大 響聲傳得好遠(yuǎn)好遠(yuǎn) 驚動(dòng)了周邊的所有飛禽走獸 一棵樹倒了 樹杈上的鳥窩碎了 茅草散落一地...
    瓶水之冰閱讀 200評(píng)論 1 3
  • JDK 版本: 1.8.0_45 常量 DEFAULT_INITIAL_CAPACITY = 16; 默認(rèn)容器大小...
    binwin20閱讀 242評(píng)論 0 0