一篇文章讀懂JSON


什么是json?

W3C JSON定義修改版:

  • JSON 指的是 JavaScript 對象表示法JavaScript Object Notation)
  • JSON 是輕量級文本數據交換格式,並不是編程語言
  • JSON 獨立於語言存在
  • JSON 具有自我描述性,更易理解

讀書,有必要對概念有較為清晰的認識。以下就涉及到的名詞解釋一下。

1)JavaScript對象表示法。JSON語法無非是對JavaScript對象的表述,甭管是用對象數組、單純的對象還是組成對象的簡單值,這些都只是為了描述對象或者多個對象服務的。如果不理解,那么請看以下例子。

10000   // 簡單值,傳遞的數據幾乎看不懂,到底代表什么意思?10000人?10000元?

["Sally", 25, 10000]   // 數組,傳遞的數據可能無法解讀,Sally也許是一個品牌,25或許是品牌創立時間長度

{"name": "Sally", "age": 25, "salary": 10000}  // 一個對象,能夠讀懂數據意義

[{"name": "Sally", "age": 25, "salary": 10000},
{"name": "Jimmy", "age": 30, "salary": 20000}]   // 對象數組(多個對象),能夠讀懂數據意義

Array和Object在JavaScript中都是復雜數據類型,但是如果需要產生意義的數據,以鍵對值(name/value)形式才是最佳途徑。雖然數組等單獨存在的形式雖然仍然可以作為數據傳輸,但是顯然沒有對象形式來的一目了然。

當然,我個人感覺通過名字來取值比使用數組索引取值要來的直觀、方便、可靠。而且,這種方式和XML也很相似。

2)JSON屬於輕量級的數據交換協議。一般而言,輕量級(lightweight)等價於耦合度低、侵入性小。不過在這里既可以指JSON與編程語言的耦合度小,又可以說明JSON文檔儲存相同信息所占的資源少的。再者,JSON和XML一樣,既可以作為配置文件、也可以作為數據傳輸協議存在,當然,在JS中使用JSON比XML更優。

3)JSON語法上屬於ECMAScript定義的子集,但是並不代表JSON從屬於JavaScript。必須要明確一點,JSON是種數據傳輸的格式,不是一門編程語言,也不是只有JavaScript才使用JSON,比如近些年比較熱門的Python、Java也能夠使用JSON,即只要有相應的庫(滿足JSON協議)即可使用JSON。

本節最后用ECMAScript-404規范中的一段話概括上面的內容。

JSON是一種輕量級、基於文本、獨立於語言的數據交換格式。JSON源於ECMAScript編程語言,但是相對編程語言獨立。JSON為可移植的結構化數據表示定義了一個結構化規則集。


JSON的誕生

在JSON協議誕生之前,XML作為在互聯網上傳輸數據的事實標准存在已經很多年。但是,業界也有對XML的抱怨,比如XML文檔雖然易讀寫,但是相對來講比較繁鎖、冗長,雖然能夠幾乎橫跨所有編程語言而且傳輸數據量大,但是執行效率過低等等。

大概在2001年左右,JSON便開始了小規模應用。直到2006年,一個叫Douglas Crockford的人,將JSON作為RFC文檔提交到IETF,之后JSON正式成為了計算機網絡通訊的標准協議之一。

可能沒有學習過計算機網絡的人會感到疑惑,開始不是說數據格式嗎?怎么這里又變成協議了?兩者到底是什么關系?

用比較有深度的話來說,協議就是涵蓋了語義、語法、同步三大問題。而格式可能只能包含語義、語法。 也就是說在概念上,協議>=格式。

json語法

JSON語法支持的數據結構:

1)簡單值

json支持javascript的簡單數據類型String(字符串)、Number(數值)、Boolean(布爾值),以及特殊數據類型null。但是不支持ECMAScript中的undefined

注意:JSON字符串必須使用雙引號(單引號會導致語法錯誤,與JS有區別),key必須使用雙引號。如下的前四種形式都是錯誤的。

{'name': "Sally"}   // 錯
{name: "Sally"}     // 錯
{"name": 'Sally'}   // 錯
{"name": Sally}     // 錯
{"name": "Sally"} // 對
{"age": 25} // 對

2)對象

JavaScript中對象字面量,可以給屬性加單引號對('')、雙引號對(""),甚至可以不加引號。如下圖所示,不加雙引號和加雙引號均可。

但是,我們在開發JavaScript程序時,往往會補上雙引號對("")。

var object = {
    "name": "Nicholas",
    "age": 29   
};

與JavaScript中使用JSON形式創建對象不同,真正的JSON協議是沒有變量聲明以及變量名的(JSON作為數據傳輸協議,沒有變量概念)。其次,JSON也沒有語句末尾的分號";"(JSON不是JS語句,不需要分號)

3)數組

 

讀到這里,可能你還會存在如下問題:

為什么JSON不支持ECMAScript語法中的特殊值undefined關鍵詞?

為什么JSON對象屬性必須使用雙引號?

為什么JSON語句行末尾不需要加分號?

為什么JSON中沒有變量的概念?

以上問題的解答就是基於一點,那就是JSON是一種用於各種編程語言之間數據交換的格式標准。

並不是每一種編程語言都支持undefined(比如Java、python等都沒有undefined關鍵詞),但是其余的數據類型在別的編程語言中都能得到原生支持;

對象屬性必須加引號可以避免在屬性值中出現空格導致信息出錯問題,還方便接收方判斷屬性范圍;

分號、變量對JSON來說毫無意義,因為JSON得目的是傳輸不可變的數據,只要擁有足夠多對數據區分的符號足以。

解析與序列化

ECMAScript 5對解析JSON的行為進行規范,定義了全局對象JSON,即瀏覽器原生JSON對象

JSON對象定義了兩個方法:

  • stringify()   ,JS對象序列化為JSON字符串
  • parse()       ,JSON字符串解析為JS對象

為什么JavaScript不推薦使用其原生函數eval()解析json?

eval函數功能強大,常用於求值。但是,eval函數並不會對求值內容做檢查,尤其是對字符串。因此,使用eval得到的並不是JSON,可能是一段惡意程序。

json和xml比較 

Douglas Crockford認為,與xml相比,JSON在JavaScript中讀寫結構化數據的更優選擇。因為在JavaScript中可以直接用原生的eval()函數解析JSON數據,而不必再創建DOM對象。 

參考文獻

1、《Professional JavaScript for Web Developers 3rd Edtion》  Nicholas C.Zakas

2、W3School JSON

3、JSON與XML的區別比較

4、Standard ECMA-404文檔


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM