大家好奏路,我是IT修真院深圳分院第01期學(xué)員畴椰,一枚正直善良的web程序員。
今天給大家分享一下鸽粉,修真院官網(wǎng) JS任務(wù)中可能會使用到的知識點(diǎn):
JSON是什么斜脂,如何處理轉(zhuǎn)義?
1.背景介紹
什么是JSON
JSON (JavaScript Object Notation, JS 對象標(biāo)記) 是一種輕量級的數(shù)據(jù)交換格式触机。它基于 ECMAScript (w3c制定的js規(guī)范)的一個子集帚戳,采用完全獨(dú)立于編程語言的文本格式來存儲和表示數(shù)據(jù)。簡潔和清晰的層次結(jié)構(gòu)使得 JSON 成為理想的數(shù)據(jù)交換語言儡首。 易于人閱讀和編寫片任,同時也易于機(jī)器解析和生成,并有效地提升網(wǎng)絡(luò)傳輸效率蔬胯《怨——百度百科
數(shù)據(jù)傳輸是我們在敲代碼時,經(jīng)常遇到的一個場景,前后端交互氛濒。給數(shù)據(jù)一個統(tǒng)一的格式有利于我們編寫和解析數(shù)據(jù)犁钟。
json,是一種數(shù)據(jù)格式泼橘,在與后端的數(shù)據(jù)交互中有較為廣泛的應(yīng)用涝动。
JSON的誕生
JSON是 (JavaScript Object Notation, JS 對象標(biāo)記),它是一種數(shù)據(jù)交換格式炬灭。在JSON出現(xiàn)之前醋粟,大家一直用XML來傳遞數(shù)據(jù)。因?yàn)閄ML是一種純文本格式重归,所以它適合在網(wǎng)絡(luò)上交換數(shù)據(jù)米愿。XML本身不算復(fù)雜,但是鼻吮,加上DTD育苟、XSD、XPath椎木、XSLT等一大堆復(fù)雜的規(guī)范以后违柏,任何正常的軟件開發(fā)人員碰到XML都會感覺頭大了,最后大家發(fā)現(xiàn)香椎,即使你努力鉆研幾個月漱竖,也未必搞得清楚XML的規(guī)范。
終于畜伐,在2002年的一天馍惹,道格拉斯·克羅克福特(DouglasCrockford)同學(xué)為了拯救深陷水深火熱同時又被某幾個巨型軟件企業(yè)長期愚弄的軟件工程師,發(fā)明了JSON這種超輕量級的數(shù)據(jù)交換格式。
由于JSON非常簡單万矾,很快就風(fēng)靡Web世界悼吱,并且成為ECMA標(biāo)準(zhǔn)。幾乎所有編程語言都有解析JSON的庫良狈,而在JavaScript中后添,我們可以直接使用JSON,因?yàn)镴avaScript內(nèi)置了JSON的解析们颜。把任何JavaScript對象變成JSON,就是把這個對象序列化成一個JSON格式的字符串猎醇,這樣才能夠通過網(wǎng)絡(luò)傳遞給其他計(jì)算機(jī)窥突。如果我們收到一個JSON格式的字符串,只需要把它反序列化成一個JavaScript對象硫嘶,就可以在JavaScript中直接使用這個對象了阻问。
轉(zhuǎn)義
我們在調(diào)用 jsonp 接口或者調(diào)用js文件的時候,由于文件編碼不同會導(dǎo)致出現(xiàn)亂碼的問題沦疾。 如果你的文件出現(xiàn)了非英文字符称近,如果調(diào)用時文件編碼不一致,同樣會出現(xiàn)亂碼情況哮塞。
這也就是為什么要數(shù)據(jù)統(tǒng)一格式的原因刨秆。
JSON 是適用于 Ajax 應(yīng)用程序的一種有效格式,原因是它使 JavaScript 對象和字符串值之間得以快速轉(zhuǎn)換 JSON是一種傳遞對象的語法
JSON是一個提供了stringify和parse方法的內(nèi)置對象
stringify將js對象轉(zhuǎn)化為符合json標(biāo)準(zhǔn)的字符串
parse將符合json標(biāo)準(zhǔn)的字符串轉(zhuǎn)化為js對象
2.知識剖析
JSON語法
數(shù)據(jù)在名稱/值對中
數(shù)據(jù)由逗號分隔
大括號保存對象
中括號保存數(shù)組
JSON值
數(shù)字(整數(shù)/浮點(diǎn)數(shù))
字符串(雙引號)
布爾值(true/false)
數(shù)組(中括號中)
對象(大括號中)
null
實(shí)例
JSON 數(shù)據(jù)的書寫格式是:名稱/值對忆畅。
名稱/值對組合中的名稱寫在前面(在雙引號中)衡未,值對寫在后面,中間用冒號隔開家凯,
其中 值 可以是:數(shù)字(整數(shù)或浮點(diǎn)數(shù))缓醋、字符串(在雙引號中)、布爾值(true或false)绊诲、數(shù)組(在方括號中)送粱、對象(在花括號中)、null
varjson= {"password":123456,"name":"myname","Booleans":true,"Array":[x,y,z],"object":{}}
或者是嵌套使用
轉(zhuǎn)義概述
為什么需要轉(zhuǎn)義掂之?在js中我們使用的js對象進(jìn)行處理抗俄,但是在與后端數(shù)據(jù)交換的時候,我們發(fā)送規(guī)定的json格式的字符串世舰,所以在給后端發(fā)送或接受數(shù)據(jù)的時候橄镜,需要轉(zhuǎn)義
{name:"myname",password:123456}
"{"name":"myname","password":123456}"
其中json字符串轉(zhuǎn)js對象,調(diào)用parse方法:
js對象 = JSON.parse(json字符串);
js對象轉(zhuǎn)json字符串冯乘,調(diào)用stringify方法:
json字符串 = JSON.stringify(js對象);
3.常見問題
在json字符串轉(zhuǎn)換成對象洽胶,還有eval_r('('+json字符串+')')這個方法,但是在對目標(biāo)數(shù)據(jù)進(jìn)行讀取時,可能會出現(xiàn)一些意外的錯誤:
4.解決方案
原因:eval_r獲取的json對象的值中姊氓,如果有執(zhí)行代碼丐怯,也將照樣執(zhí)行!所以若不能保證數(shù)據(jù)的安全性翔横,不要使用eval_r方法進(jìn)行轉(zhuǎn)義读跷。
5.編碼實(shí)戰(zhàn)
下面是一個簡單的json數(shù)據(jù)發(fā)送應(yīng)用,有興趣可以閱讀一下:
6.擴(kuò)展思考
我們澈萄洌看到
{name:"myname",password:123456}
和
{"name":"myname","password":123456}
這樣兩種格式效览,即js對象和json,然而js對象和json有什么不一樣的地方荡短?
很多人搞不清楚 JSON 和 Js 對象的關(guān)系丐枉,甚至連誰是誰都不清楚。其實(shí)掘托,可以這么理解:
JSON 是 JS 對象的字符串表示法瘦锹,它使用文本表示一個 JS 對象的信息,本質(zhì)是一個字符串闪盔。
如
var obj = {a: 'Hello', b: 'World'}; //這是一個對象弯院,注意鍵名也是可以使用引號包裹的
var json = '{"a": "Hello", "b": "World"}'; //這是一個 JSON 字符串,本質(zhì)是一個字符串
7.參考文獻(xiàn)
參考一:JSON官方文網(wǎng)
參考三:json屬性名必須加引號的討論
8.更多討論
XML是什么泪掀?
JAVASCRIPT對象的KEY可不可以直接數(shù)字听绳,如果寫數(shù)字,那么它最終是什么數(shù)據(jù)類型