最近在逛程式設計問題解答的時候,看到這樣的提問:如何將一個JSON陣列型別的字串轉換為JSON陣列,然後遍歷陣列取出JSON物件,最後在JS中取出裡面的屬性。在這裡給同樣有疑問的朋友做下解答,
首先我們追本溯源問一下,JSON究竟是什麼東西?為什麼JSON就是易於資料交換?本文將從以下幾個方面去理解JSON:
首先是對“JSON是一種輕量的資料交換格式”的理解;
然後來看經常被混為一談的JSON和JS物件的區別;
json字串轉換成json陣列並遍歷屬性值;
什麼是JSON?JSON是一種輕量級的資料交換格式。
如果沒有去過JSON的官方介紹可以去一下這裡,官方介紹已經很清楚地表述了JSON是什麼,我將JSON是什麼提煉成以下幾個方面:
1. 一種資料格式
什麼是格式?就是規範你的資料要怎麼表示,舉個栗子,有個人叫“二百六”,身高“160cm”,體重“60kg”,現在你要將這個人的這些資訊傳給別人或者別的什麼東西,你有很多種選擇:
以上所有選擇,傳遞的資料是一樣的,但是你可以看到形式是可以各式各樣的,這就是各種不同格式化後的資料,JSON是其中一種表示方式。
2. 基於文字的資料格式
JSON是基於文字的資料格式,相對於基於二進位制的資料,所以JSON在傳遞的時候是傳遞符合JSON這種格式(至於JSON的格式是什麼我們第二部分再說)的字串,我們常會稱為“JSON字串”。
3. 輕量級的資料格式
在JSON之前,有一個數據格式叫xml,現在還是廣泛在用,但是JSON更加輕量,如xml需要用到很多標籤,像上面的例子中,你可以明顯看到xml格式的資料中標籤本身佔據了很多空間,而JSON比較輕量,即相同資料,以JSON的格式佔據的頻寬更小,這在有大量資料請求和傳遞的情況下是有明顯優勢的。
4. 被廣泛地用於資料交換
輕量已經是一個用於資料交換的優勢了,但更重要的JSON是易於閱讀、編寫和機器解析的,即這個JSON對人和機器都是友好的,而且又輕,獨立於語言(因為是基於文字的),所以JSON被廣泛用於資料交換。
以前端JS進行ajax的POST請求為例,後端PHP處理請求為例:
可以看到,相同的資料在這裡有3種不同的表現形式,分別是前端的JS物件、傳輸的JSON字串、後端的PHP物件,JS物件和PHP物件明顯不是一個東西,但是由於大家用的都是JSON來傳遞資料,大家都能理解這種資料格式,都能把JSON這種資料格式很容易地轉化為自己能理解的資料結構,這就方便啦,在其他各種語言環境中交換資料都是如此。
經常被混為一談的JSON和JS物件很多時候都聽到“JSON是JS的一個子集”這句話,而且這句話我曾經也一直這麼認為,每個符合JSON格式的字串你解析成js都是可以的,直到後來發現了一個奇奇怪怪的東西…
1. 兩個本質不同的東西為什麼那麼密切
JSON和JS物件本質上完全不是同一個東西,就像“斑馬線”和“斑馬”,“斑馬線”基於“斑馬”身上的條紋來呈現和命名,但是斑馬是活的,斑馬線是非生物。
同樣,”JSON”全名”JavaScript Object Notation”,所以它的格式(語法)是基於JS的,但它就是一種格式,而JS物件是一個例項,是存在於記憶體的一個東西。
說句玩笑話,如果JSON是基於PHP的,可能就叫PON了,形式可能就是這樣的了[‘propertyOne’ => ‘foo’, ‘propertyTwo’ => 42,],如果這樣,那麼JSON可能現在是和PHP比較密切了。
此外,JSON是可以傳輸的,因為它是文字格式,但是JS物件是沒辦法傳輸的,在語法上,JSON也會更加嚴格,但是JS物件就很鬆了。
那麼兩個不同的東西為什麼那麼密切,因為JSON畢竟是從JS中演變出來的,語法相近。
2. JSON格式別JS物件語法表現上嚴格在哪
先就以“鍵值對為表現的物件”形式上,對比下兩者的不同,至於JSON還能以怎樣的形式表現,對比完後再羅列。
可以看到,相對於JS物件,JSON的格式更嚴格,所以大部分寫的JS物件是不符合JSON的格式的。
json字串轉換成json陣列並遍歷屬性值方式一:使用Iterator迭代器遍歷取值
方法二:使用for迴圈