JSON是什么,如何處理轉(zhuǎn)義?

數(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格式的值
不合格JSON格式的值

什么是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)行篩選

對(duì)obj3對(duì)象的值進(jìn)行了篩選,只選擇和數(shù)組中值相等的key的值

當(dāng)replacer是方法是,其作用類似給傳入的對(duì)象的每一個(gè)符合方法條件的值一個(gè)方法進(jìn)行迭代

對(duì)原對(duì)象中符合要求的每一個(gè)值傳入一個(gè)方法,類似于數(shù)組中的迭代,返回迭代后的值。

第三個(gè)參數(shù)是對(duì)顯示數(shù)據(jù)進(jìn)行排版,對(duì)每一個(gè)鍵值對(duì)換行處理。值可以是數(shù)字或字符串。當(dāng)起為數(shù)字時(shí),一個(gè)數(shù)字代表鍵值對(duì)前面的空格,數(shù)字不大于10。字符串同理,只是將空格換成相應(yīng)的字符,字符最多不能大于10個(gè)。

每一項(xiàng)鍵值對(duì)獨(dú)占一行并且縮進(jìn)四個(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):

JSON對(duì)象

JSON stringify語(yǔ)法實(shí)例講解

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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