本章內容
? 理解JSON 語法
? 解析JSON
? JSON 序列化
正如上一章所說,XML 曾經一度成為互聯網上傳輸數據的事實標準。第一代Web 服務很大程度上
是以XML 為基礎的,以服務器間通信為主要特征。可是,XML 也并非沒有批評者。有的人認為XML
過于冗余和啰唆。為解決這些問題,也出現了幾種方案。不過Web 已經朝著它的新方向進發了。
2006 年,Douglas Crockford 在國際互聯網工程任務組(IETF,The Internet Engineering Task Force)
制定了JavaScript 對象簡譜(JSON,JavaScript Object Notation)標準,即RFC 4627。但實際上,JSON
早在2001 年就開始使用了。JSON 是JavaScript 的嚴格子集,利用JavaScript 中的幾種模式來表示結構
化數據。Crockford 將JSON 作為替代XML 的一個方案提出,因為JSON 可以直接傳給eval()而不需
要創建DOM。
理解JSON 最關鍵的一點是要把它當成一種數據格式,而不是編程語言。JSON 不屬于JavaScript,
它們只是擁有相同的語法而已。JSON 也不是只能在JavaScript 中使用,它是一種通用數據格式。很多語
言都有解析和序列化JSON 的內置能力。
語法
JSON 語法支持表示3 種類型的值。
? 簡單值:字符串、數值、布爾值和null 可以在JSON 中出現,就像在JavaScript 中一樣。特殊
值undefined 不可以。
? 對象:第一種復雜數據類型,對象表示有序鍵/值對。每個值可以是簡單值,也可以是復雜類型。
? 數組:第二種復雜數據類型,數組表示可以通過數值索引訪問的值的有序列表。數組的值可以
是任意類型,包括簡單值、對象,甚至其他數組。
JSON 沒有變量、函數或對象實例的概念。JSON 的所有記號都只為表示結構化數據,雖然它借用了
JavaScript 的語法,但是千萬不要把它跟JavaScript 語言混淆。
簡單值
最簡單的JSON 可以是一個數值。例如,下面這個數值是有效的JSON:
5
這個JSON 表示數值5。類似地,下面這個字符串也是有效的JSON:
“Hello world!”
JavaScript 字符串與JSON 字符串的主要區別是,JSON 字符串必須使用雙引號(單引號會導致語法
錯誤)。
布爾值和null 本身也是有效的JSON 值。不過,實踐中更多使用JSON 表示比較復雜的數據結構,
其中會包含簡單值。
對象
對象使用與JavaScript 對象字面量略為不同的方式表示。以下是JavaScript 中的對象字面量:
let person = {
name: “Nicholas”,
age: 29
};
雖然這對JavaScript 開發者來說是標準的對象字面量,但JSON 中的對象必須使用雙引號把屬性名
包圍起來。下面的代碼與前面的代碼是一樣的:
let object = {
“name”: “Nicholas”,
“age” : 29
};
而用JSON 表示相同的對象的語法是:
{
“name”: “Nicholas”,
“age”: 29
}
與JavaScript 對象字面量相比,JSON 主要有兩處不同。首先,沒有變量聲明(JSON 中沒有變量)。
其次,最后沒有分號(不需要,因為不是JavaScript 語句)。同樣,用引號將屬性名包圍起來才是有效的
JSON。屬性的值可以是簡單值或復雜數據類型值,后者可以在對象中再嵌入對象,比如:
{
“name”: “Nicholas”,
“age”: 29,
“school”: {
“name”: “Merrimack College”,
“location”: “North Andover, MA”
}
}
這個例子在頂級對象中又嵌入了學校相關的信息。即使整個JSON 對象中有兩個屬性都叫"name",
但它們屬于兩個不同的對象,因此是允許的。同一個對象中不允許出現兩個相同的屬性。
與JavaScript 不同,JSON 中的對象屬性名必須始終帶雙引號。手動編寫JSON 時漏掉這些雙引號或
使用單引號是常見錯誤。