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對象。