JSON

JSON 是一種數(shù)據(jù)格式,而不是一種編程語言。雖然與 JavaScript 具有相同的語法形式,但從不屬于 JavaScript臭挽。很多編程語言都有針對(duì) JSON 的解析器和序列化器。

語法

JSON 語法可以支持三種類型值咬腕,分別是簡(jiǎn)單值(string, number, boolean, null, 不支持undefined)欢峰,對(duì)象和數(shù)組。

如果是簡(jiǎn)單值涨共,注意如果是字符串時(shí)必須要用雙引號(hào)而不能使用單引號(hào)纽帖。如下:

"Hello word!"

如果是對(duì)象,則對(duì)象的屬性必須用雙引號(hào)举反。如下:

{
    "name": "xiaobai",
    "age": 22
}

如果是數(shù)組懊直,如下:

["xiaobai", "xiaohei", "xiaohong"]

三者組合起來可以成為很復(fù)雜的數(shù)據(jù)類型:

[
    {
        "title": "book1",
        "authors": [
            "xiaobai"
        ],
        "year": 2013
    }
    {
        "title": "book2",
        "authors":[
            "xiaohei", "xiaohong"
        ]
        "year": 2013
    }
]

JSON 序列化

JSON.stringify() 可以把一個(gè) JavaScript 對(duì)象序列化為一個(gè) JSON 字符串。另外還可以接受兩個(gè)可選參數(shù)火鼻,第一個(gè)參數(shù)是一個(gè)過濾器室囊,可以是一個(gè)
數(shù)組,也可以是一個(gè)函數(shù)魁索;第二個(gè)參數(shù)是一個(gè)選項(xiàng)融撞,表示是否在 JSON 字符串中保留縮進(jìn)。

如果過濾器的參數(shù)是數(shù)組粗蔚,那么 JSON.stringify() 將只列出數(shù)組中所列出的屬性尝偎。

var person = {
    "name": "xiaobai",
    "sisters": [
        "xiaohong", "xiaohei"
    ],
    "age": 22
}

var jsonText = JSON.stringify(person,["name", "age"]);

因此,返回的字符串中鹏控,只會(huì)包含 name 和 age 這兩個(gè)屬性致扯。

{"name":"xiaobai","age":22}

如果過濾器是一個(gè)函數(shù),傳入的函數(shù)接受兩個(gè)參數(shù)当辐,屬性名和屬性值急前。根據(jù)屬性名可以直到如何處理序列化的對(duì)象中的屬性。

var jsonText = JSON.stringify(person, function(key, value){
    switch(key){
        case "name":
            return "new name";
        case "sisters":
            return value.join(",");
        case "age":
            return undefined;
        default:
            return value;
    }
});

此時(shí)返回的字符串如下:

{"name":"new name", "sisters":"xiaohong,xiaohei"}

JSON.stringify() 的第三個(gè)參數(shù)可以控制結(jié)果中的縮進(jìn)和空白符瀑构。如果第一個(gè)參數(shù)是一個(gè)數(shù)值,那么它表示縮進(jìn)的空格數(shù)刨摩,例如:

var jsonText = JSON.stringify(book, null, 4);

則生成的字符串如下:

{
    "name": "xiaobai",
    "sisters" : [
        "xiaohong", "xiaohei"
    ],
    "age": 22
}

JSON.stringify() 自動(dòng)在字符串中加入了換行符寺晌,最大縮進(jìn)的空格數(shù)為10,所有大于10的值都會(huì)自動(dòng)轉(zhuǎn)換為10。

如果縮進(jìn)的參數(shù)是一個(gè)字符串而非一個(gè)數(shù)值澡刹,那么這個(gè)字符串在 JSON 字符串中被用作縮進(jìn)符呻征。例如:

var jsonText = JSON.stringify(person, null, "--");

則生成的字符串變成了:

{
--"name": "xiaobai",
--"sisters": [
----"xiaohong", "xiaohei"
--]
--"age": 22
}

toJSON() 的方法

有時(shí)候,JSON.stringify() 并不能滿足一些對(duì)象進(jìn)行自定義序列化要求罢浇。這時(shí)陆赋,可以調(diào)用對(duì)象上的 toJSON() 的方法沐祷,返回其自定義的 JSON 格式。比如攒岛,Date 的對(duì)象就具有該方法赖临,用戶將其轉(zhuǎn)換為一個(gè)日期字符串。例如:

var person = {
    "name": "xiaobai",
    "sisters": [
        "xiaohong", "xiaohei"
    ],
    "age": 22,
    toJSON: function(){
        return this.name;
    }
};

var jsonText = JSON.stringify(person);

則生成的字符串中只包含了name的屬性值灾锯。

toJSON() 可以作為函數(shù)過濾器的補(bǔ)充兢榨,因此理解序列化內(nèi)部的順序十分重要。

  1. 如果存在 toJSON() 的方法而且通過它能取的有效值,則調(diào)用該方法顺饮。否則按默認(rèn)的順序執(zhí)行序列化吵聪。
  2. 如果提供了第二個(gè)參數(shù),應(yīng)用這個(gè)過濾器兼雄。傳入過濾器的值是第一步返回的結(jié)果吟逝。
  3. 對(duì)第二步返回的每個(gè)值進(jìn)行相應(yīng)的序列化。
  4. 如果提供了第三個(gè)參數(shù)赦肋,執(zhí)行相應(yīng)的格式化块攒。

解析

JSON.parse() 可以把 JSON 字符串解析為原生的 JavaScript 的值。該方法也接受一個(gè)可選參數(shù)金砍,帶參數(shù)是一個(gè)函數(shù)局蚀,通常稱為還原函數(shù),將在每個(gè)屬性值上調(diào)用恕稠。該函數(shù)也接受兩個(gè)參數(shù)琅绅,屬性健和屬性值,而且都需要返回一個(gè)值鹅巍。

var book = {
    title: "Professional JavaScript",
    releaseDate: new Date(2011, 11, 1)
};

var jsonText = JSON.stringify(book);

var bookCopy = JSON.parse(jsonText, function(key, value){
    if(key == "releaseDate"){
        return new Date(value);
    }else{
        return value;
    }
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末千扶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子骆捧,更是在濱河造成了極大的恐慌澎羞,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敛苇,死亡現(xiàn)場(chǎng)離奇詭異妆绞,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)枫攀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門括饶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人来涨,你說我怎么就攤上這事图焰。” “怎么了蹦掐?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵技羔,是天一觀的道長(zhǎng)僵闯。 經(jīng)常有香客問我,道長(zhǎng)藤滥,這世上最難降的妖魔是什么鳖粟? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮超陆,結(jié)果婚禮上牺弹,老公的妹妹穿的比我還像新娘。我一直安慰自己时呀,他們只是感情好张漂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著谨娜,像睡著了一般航攒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上趴梢,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天漠畜,我揣著相機(jī)與錄音,去河邊找鬼坞靶。 笑死憔狞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的彰阴。 我是一名探鬼主播瘾敢,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼尿这!你這毒婦竟也來了簇抵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤射众,失蹤者是張志新(化名)和其女友劉穎碟摆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叨橱,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡典蜕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了罗洗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘉裤。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖栖博,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厢洞,我是刑警寧澤仇让,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布典奉,位于F島的核電站,受9級(jí)特大地震影響丧叽,放射性物質(zhì)發(fā)生泄漏卫玖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一踊淳、第九天 我趴在偏房一處隱蔽的房頂上張望假瞬。 院中可真熱鬧,春花似錦迂尝、人聲如沸脱茉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琴许。三九已至,卻和暖如春溉躲,著一層夾襖步出監(jiān)牢的瞬間榜田,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工锻梳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箭券,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓疑枯,卻偏偏與公主長(zhǎng)得像辩块,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子神汹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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

  • 曾經(jīng)有一段時(shí)間庆捺,XML是互聯(lián)網(wǎng)上傳輸結(jié)構(gòu)化數(shù)據(jù)的事實(shí)標(biāo)準(zhǔn)。JSON是JavaScript的一個(gè)嚴(yán)格的子集屁魏,利用了J...
    給我一炷香的時(shí)間閱讀 670評(píng)論 0 2
  • 我們先來看一個(gè)JS中常見的JS對(duì)象序列化成JSON字符串的問題氓拼,請(qǐng)問你画,以下JS對(duì)象通過JSON.stringify...
    Stinson閱讀 2,273評(píng)論 0 44
  • JSON 格式 JSON 格式(JavaScript Object Notation的縮寫)是一種用于數(shù)據(jù)交換的文...
    oWSQo閱讀 193評(píng)論 0 1
  • 當(dāng)這灰蒙蒙的深秋在不經(jīng)意間悄悄到來的時(shí)候,我已在大學(xué)中學(xué)習(xí)和生活了兩個(gè)月的時(shí)間了。這里的一切對(duì)我來說都已不像當(dāng)初那...
    該用戶昵稱未填寫閱讀 183評(píng)論 0 0
  • 因?yàn)榇蛩阍谥芰?qǐng)客桃漾,所以周五去買了一把鮮花坏匪。九朵康乃馨、兩支粉百合撬统。百合含苞待放适滓,康乃馨正在盛開,我很喜歡恋追。 為了...
    行云流水joy閱讀 318評(píng)論 0 2