2001:JSON 的發明#
事件#
2001年,Douglas Crockford(與 Chip Morningstar)以 JavaScript 的物件字面量為基礎,定義了 JSON(JavaScript Object Notation) 資料格式。2005年 JSON.org 網站普及、Yahoo 開始採用;2009年 ES5 正式把 JSON.parse/JSON.stringify 納入標準(見 2009-ES5嚴格模式與JSON)。2013年 JSON 成為 ECMA-404 / ISO 標準。
為何重要#
- 取代 XML 成為 Web 資料交換的事實標準:XML 冗長(
<name><first>...</first></name>),JSON 簡潔({"first": "..."})、可直接被 JavaScript 解析為物件。 - 「JavaScript 的子集征服了世界」:JSON 最初只是 JS 語法的一小部分,卻成為所有語言(Python、Java、Go、Rust…)通用的資料格式,是 JavaScript 對電腦科學最意外的貢獻之一。
- Ajax 的最佳拍檔:XHR 傳回 JSON、JS 直接使用,資料往返成本大幅降低。
理論與實用原因#
- 理論原因:JSON 恰好對應資料結構的兩大基本型——物件(鍵值對應)與陣列(有序列表),加上四種純量(字串、數字、布林、null),足以表示任何結構化資料(類似 Lisp 的 S-expression 通用性)。
- 實用原因:XML 的解析器複雜、檔案肥大、標準(XSD、namespaces)過度工程化;開發者要的是「看得懂、解析快、傳得小」。
彌補了什麼缺陷#
彌補了 XML 作為 Web 資料格式的冗長、解析複雜、與 JavaScript 不同構的缺陷——XML 傳回後還要透過 DOM API 層層取出,JSON 則直接就是 JS 物件。
相關條目#
程式範例#
1. XML vs JSON:同一份資料的對照#
<!-- XML:冗長、要透過 DOM API 層層取出 -->
<user>
<name>Ada</name>
<age>36</age>
<tags><tag>math</tag><tag>code</tag></tags>
</user>
{
"name": "Ada",
"age": 36,
"tags": ["math", "code"]
}
2. 解析的差別:XML 要爬 DOM,JSON 直接就是物件#
// XML 時代:responseXML + 層層 DOM 取值
var name = doc.getElementsByTagName("name")[0].firstChild.nodeValue;
var tags = doc.getElementsByTagName("tag"); // 還要再迴圈取出
// JSON 時代:一行,直接用
var user = JSON.parse('{"name":"Ada","age":36,"tags":["math","code"]}');
user.name; // "Ada"
user.tags[0]; // "math"
3. 安全性:eval() 的缺陷與 JSON.parse 的出現#
// ES5 之前(危險):用 eval 解析 JSON——任意程式碼執行!
var user = eval('(' + text + ')'); // 若 text 被竄改 = 執行攻擊者的程式碼
// ES5 之後(2009):原生 JSON.parse 只接受合法 JSON
var user = JSON.parse(text); // 惡意程式碼直接拋錯,不執行
JSON 的理論核心:整個格式只有兩種結構(物件 = 鍵值對、陣列 = 有序列表)加四種純量——恰好是 Lisp S-expression 通用性的最小重現。