最近在逛編程問(wèn)題解答的時(shí)候,看到這樣的提問(wèn):如何將一個(gè)JSON數(shù)組類型的字符串轉(zhuǎn)換為JSON數(shù)組,然后遍歷數(shù)組取出JSON對(duì)象,最后在JS中取出里面的屬性。在這里給同樣有疑問(wèn)的朋友做下解答,
首先我們追本溯源問(wèn)一下,JSON究竟是什么東西?為什么JSON就是易于數(shù)據(jù)交換?本文將從以下幾個(gè)方面去理解JSON:
首先是對(duì)“JSON是一種輕量的數(shù)據(jù)交換格式”的理解;
然后來(lái)看經(jīng)常被混為一談的JSON和JS對(duì)象的區(qū)別;
json字符串轉(zhuǎn)換成json數(shù)組并遍歷屬性值;
什么是JSON?JSON是一種輕量級(jí)的數(shù)據(jù)交換格式。
如果沒有去過(guò)JSON的官方介紹可以去一下這里,官方介紹已經(jīng)很清楚地表述了JSON是什么,我將JSON是什么提煉成以下幾個(gè)方面:
1. 一種數(shù)據(jù)格式
什么是格式?就是規(guī)范你的數(shù)據(jù)要怎么表示,舉個(gè)栗子,有個(gè)人叫“二百六”,身高“160cm”,體重“60kg”,現(xiàn)在你要將這個(gè)人的這些信息傳給別人或者別的什么東西,你有很多種選擇:
以上所有選擇,傳遞的數(shù)據(jù)是一樣的,但是你可以看到形式是可以各式各樣的,這就是各種不同格式化后的數(shù)據(jù),JSON是其中一種表示方式。
2. 基于文本的數(shù)據(jù)格式
JSON是基于文本的數(shù)據(jù)格式,相對(duì)于基于二進(jìn)制的數(shù)據(jù),所以JSON在傳遞的時(shí)候是傳遞符合JSON這種格式(至于JSON的格式是什么我們第二部分再說(shuō))的字符串,我們常會(huì)稱為“JSON字符串”。
3. 輕量級(jí)的數(shù)據(jù)格式
在JSON之前,有一個(gè)數(shù)據(jù)格式叫xml,現(xiàn)在還是廣泛在用,但是JSON更加輕量,如xml需要用到很多標(biāo)簽,像上面的例子中,你可以明顯看到xml格式的數(shù)據(jù)中標(biāo)簽本身占據(jù)了很多空間,而JSON比較輕量,即相同數(shù)據(jù),以JSON的格式占據(jù)的帶寬更小,這在有大量數(shù)據(jù)請(qǐng)求和傳遞的情況下是有明顯優(yōu)勢(shì)的。
4. 被廣泛地用于數(shù)據(jù)交換
輕量已經(jīng)是一個(gè)用于數(shù)據(jù)交換的優(yōu)勢(shì)了,但更重要的JSON是易于閱讀、編寫和機(jī)器解析的,即這個(gè)JSON對(duì)人和機(jī)器都是友好的,而且又輕,獨(dú)立于語(yǔ)言(因?yàn)槭腔谖谋镜模訨SON被廣泛用于數(shù)據(jù)交換。
以前端JS進(jìn)行ajax的POST請(qǐng)求為例,后端PHP處理請(qǐng)求為例:
可以看到,相同的數(shù)據(jù)在這里有3種不同的表現(xiàn)形式,分別是前端的JS對(duì)象、傳輸?shù)腏SON字符串、后端的PHP對(duì)象,JS對(duì)象和PHP對(duì)象明顯不是一個(gè)東西,但是由于大家用的都是JSON來(lái)傳遞數(shù)據(jù),大家都能理解這種數(shù)據(jù)格式,都能把JSON這種數(shù)據(jù)格式很容易地轉(zhuǎn)化為自己能理解的數(shù)據(jù)結(jié)構(gòu),這就方便啦,在其他各種語(yǔ)言環(huán)境中交換數(shù)據(jù)都是如此。
經(jīng)常被混為一談的JSON和JS對(duì)象很多時(shí)候都聽到“JSON是JS的一個(gè)子集”這句話,而且這句話我曾經(jīng)也一直這么認(rèn)為,每個(gè)符合JSON格式的字符串你解析成js都是可以的,直到后來(lái)發(fā)現(xiàn)了一個(gè)奇奇怪怪的東西…
1. 兩個(gè)本質(zhì)不同的東西為什么那么密切
JSON和JS對(duì)象本質(zhì)上完全不是同一個(gè)東西,就像“斑馬線”和“斑馬”,“斑馬線”基于“斑馬”身上的條紋來(lái)呈現(xiàn)和命名,但是斑馬是活的,斑馬線是非生物。
同樣,”JSON”全名”JavaScript Object Notation”,所以它的格式(語(yǔ)法)是基于JS的,但它就是一種格式,而JS對(duì)象是一個(gè)實(shí)例,是存在于內(nèi)存的一個(gè)東西。
說(shuō)句玩笑話,如果JSON是基于PHP的,可能就叫PON了,形式可能就是這樣的了[‘propertyOne’ => ‘foo’, ‘propertyTwo’ => 42,],如果這樣,那么JSON可能現(xiàn)在是和PHP比較密切了。
此外,JSON是可以傳輸?shù)模驗(yàn)樗俏谋靖袷剑荍S對(duì)象是沒辦法傳輸?shù)模谡Z(yǔ)法上,JSON也會(huì)更加嚴(yán)格,但是JS對(duì)象就很松了。
那么兩個(gè)不同的東西為什么那么密切,因?yàn)镴SON畢竟是從JS中演變出來(lái)的,語(yǔ)法相近。
2. JSON格式別JS對(duì)象語(yǔ)法表現(xiàn)上嚴(yán)格在哪
先就以“鍵值對(duì)為表現(xiàn)的對(duì)象”形式上,對(duì)比下兩者的不同,至于JSON還能以怎樣的形式表現(xiàn),對(duì)比完后再羅列。
可以看到,相對(duì)于JS對(duì)象,JSON的格式更嚴(yán)格,所以大部分寫的JS對(duì)象是不符合JSON的格式的。
json字符串轉(zhuǎn)換成json數(shù)組并遍歷屬性值方式一:使用Iterator迭代器遍歷取值
方法二:使用for循環(huán)