跳轉到

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 通用性的最小重現。