數(shù)據(jù)傳輸是我們?cè)诰帉?xiě)代碼時(shí)經(jīng)常遇到的一個(gè)場(chǎng)景。給數(shù)據(jù)一個(gè)統(tǒng)一的格式有利于我們編寫(xiě)和解析數(shù)據(jù)胸私。
在JSON出現(xiàn)之前厌处,大家一直用XML來(lái)傳遞數(shù)據(jù)。XML本身不算復(fù)雜岁疼,但是阔涉,加上DTD、XSD捷绒、XPath瑰排、XSLT等一大堆復(fù)雜的規(guī)范使其變得繁瑣和難以掌握。
JSON(JavaScript Object Notation)是一種用于數(shù)據(jù)交換的文本格式暖侨,2001年由 Douglas Crockford 提出椭住,目的是取代繁瑣笨重的 XML 格式。
相比 XML 格式字逗,JSON 格式有兩個(gè)顯著的優(yōu)點(diǎn):書(shū)寫(xiě)簡(jiǎn)單京郑,一目了然;符合 JavaScript 原生語(yǔ)法扳肛,可以由解釋引擎直接處理傻挂,不用另外添加解析代碼。所以挖息,JSON迅速被接受金拒,已經(jīng)成為各大網(wǎng)站交換數(shù)據(jù)的標(biāo)準(zhǔn)格式。
這次就聊一下JSON的基本用法
什么是JSON格式:
JSON是一種傳輸數(shù)據(jù)的格式套腹,它對(duì)其所傳數(shù)據(jù)的類型和格式有嚴(yán)格的規(guī)定:
1绪抛、復(fù)合類型的值只能是數(shù)組或?qū)ο螅荒苁呛瘮?shù)电禀、正則表達(dá)式對(duì)象幢码、日期對(duì)象。
2尖飞、簡(jiǎn)單類型的值只有四種:字符串症副、數(shù)值(必須以十進(jìn)制表示)、布爾值和null(不能使用NaN, Infinity, -Infinity和undefined)政基。
3贞铣、字符串必須使用雙引號(hào)表示,不能使用單引號(hào)沮明。
4辕坝、對(duì)象的鍵名必須放在雙引號(hào)里面。
5荐健、數(shù)組或?qū)ο笞詈笠粋€(gè)成員的后面酱畅,不能加逗號(hào)
什么是JSON對(duì)象琳袄?
通俗來(lái)講,每個(gè)符合JSON格式的值就是一個(gè)JSON對(duì)象纺酸。也就是說(shuō)窖逗,每個(gè)JSON對(duì)象,都是一個(gè)值餐蔬。一個(gè)JSON對(duì)象對(duì)應(yīng)且只對(duì)應(yīng)一個(gè)值滑负,要么是簡(jiǎn)單類型的值,要么是復(fù)合類型的值用含。
上面舉例的每一個(gè)符合JSON格式的值都是一個(gè)JSON對(duì)象
由于JSON的流行,ES5 中增加了一個(gè)JSON對(duì)象帮匾,用來(lái)處理 JSON 格式的數(shù)據(jù)啄骇。它有兩個(gè)方法:JSON.stringify()和JSON.parse()。
JSON.stringify()將JS對(duì)象轉(zhuǎn)化為符合JSON標(biāo)準(zhǔn)的字符串
JSON.parse()將符合JSON標(biāo)準(zhǔn)的字符串轉(zhuǎn)化為JS對(duì)象
JSON.stringify有三個(gè)參數(shù):
JSON.stringify(value [, replacer] [, space])
value:是必須要的字段瘟斜。就是你輸入的值缸夹,比如數(shù)組啊,對(duì)象啊等等螺句。
replacer:這個(gè)是可選的虽惭。它又分為2種方式,一種是方法蛇尚,第二種是數(shù)組芽唇。
當(dāng)replacer是數(shù)組時(shí),其作用是對(duì)傳入的對(duì)象值進(jìn)行篩選
當(dāng)replacer是方法是匆笤,其作用類似給傳入的對(duì)象的每一個(gè)符合方法條件的值一個(gè)方法進(jìn)行迭代
第三個(gè)參數(shù)是對(duì)顯示數(shù)據(jù)進(jìn)行排版,對(duì)每一個(gè)鍵值對(duì)換行處理惦银。值可以是數(shù)字或字符串咆课。當(dāng)起為數(shù)字時(shí),一個(gè)數(shù)字代表鍵值對(duì)前面的空格扯俱,數(shù)字不大于10书蚪。字符串同理,只是將空格換成相應(yīng)的字符蘸吓,字符最多不能大于10個(gè)善炫。
常見(jiàn)的本地傳參寫(xiě)法,將需要傳遞的值用JSON轉(zhuǎn)義成符合JSON格式的字符串儲(chǔ)存在session Storage中库继,在需要用到此數(shù)據(jù)的其他頁(yè)面中提取并用JSON.parse還原數(shù)據(jù)箩艺。
可以用快遞的例子來(lái)幫助理解窜醉。JSON就像包裝公司,用JSON.stringify對(duì)我們寄送的數(shù)據(jù)進(jìn)行包裝艺谆。包裝后的數(shù)據(jù)在運(yùn)輸過(guò)程中才不會(huì)散亂榨惰、丟失,原封送到?jīng)]有亂碼静汤,收到后用JSON.parse進(jìn)行解析琅催,拆掉包裝獲取原數(shù)據(jù)。類似快遞公司不允許寄送現(xiàn)金虫给,刀具等藤抡,JSON也對(duì)需包裝的數(shù)據(jù)進(jìn)行要求,就是上面說(shuō)到的需要雙引號(hào)抹估,不能是函數(shù)之類缠黍。
JSON和XML的區(qū)別
JSON更為清晰且冗余更少些;
XML比較適合于標(biāo)記文檔药蜻,而JSON卻更適于進(jìn)行數(shù)據(jù)交換處理瓷式;
XML常常導(dǎo)致復(fù)雜的代碼,極低的開(kāi)發(fā)效率语泽;
對(duì)于大多數(shù)web應(yīng)用來(lái)說(shuō)贸典,根本不需要復(fù)雜的XML來(lái)傳輸數(shù)據(jù)。
由JSON字符串生成JSON對(duì)象時(shí)的轉(zhuǎn)義問(wèn)題:
在用JSON.parse解析JSON對(duì)象時(shí)會(huì)對(duì)其中的轉(zhuǎn)義符進(jìn)行兩次解析
在對(duì)JSON字符串'{"a":"b","b":"\\\\"}'進(jìn)行解析時(shí)踱卵,"\\\\"被解析了兩次廊驼,第一次變成"\\",第二次變成了我們看到的"\",也就是說(shuō)我們想要輸出"\"時(shí)需要輸入四個(gè)"\"
參見(jiàn):轉(zhuǎn)義字符的JSON轉(zhuǎn)義
參考文獻(xiàn):