<p><b>JSON</b>（<b>J</b>ava<b>S</b>cript <b>O</b>bject <b>N</b>otation, <span><span>/<span><span title="/ˈ/：後面為主重音">ˈ</span><span title="/dʒ/：「jam」的「j」音">dʒ</span><span title="/eɪ/：「face」的「a」音">eɪ</span><span title="「sigh」的「s」音">s</span><span title="/ən/：「button」的「on」音">ən</span></span>/</span></span>）是由美國程式設計師道格拉斯·克羅克福特構想和設計的一種輕量級資料交換格式。其內容由屬性和值所組成，因此也有易於閱讀和處理的優勢。JSON是獨立於程式語言的資料格式，其不僅是JavaScript的子集，也採用了C語言家族的習慣用法，目前也有許多程式語言都能夠將其解析和字串化，其廣泛使用的程度也使其成為通用的資料格式。
</p>


<h2><span id=".E7.B0.A1.E4.BB.8B"></span><span id="簡介">簡介</span></h2>
<p>JSON格式是1999年《<i>JavaScript Programming Language, Standard ECMA-262 3rd Edition</i>》的子集合，所以可以在JavaScript以<code>eval()</code>函式（javascript通過eval()呼叫解析器）讀入。不過這並不代表JSON無法使用於其他語言，事實上幾乎所有與網路開發相關的語言都有JSON函式庫。
</p><p>JSON的基本資料類型：
</p>
<ul><li>數值：十進位數，不能有前導0，可以為負數，可以有小數部分。還可以用<code><b>e</b></code>或者<code><b>E</b></code>表示指數部分。不能包含非數，如NaN。不區分整數與浮點數。JavaScript用雙精度浮點數表示所有數值。</li>
<li>字串：以雙引號<code><b>""</b></code>括起來的零個或多個Unicode碼位。支援反斜槓開始的跳脫字元序列。</li>
<li>布林值：表示為<code>true</code>或者<code>false</code>。</li>
<li>陣列：有序的零個或者多個值。每個值可以為任意類型。陣列使用方括號<code><b>[]</b></code>包裹。多個陣列元素之間用逗號<code><b>,</b></code>分隔，形如：<code>[value, value]</code>。</li>
<li>物件：若干無序的「鍵-值對」(key-value pairs)，其中鍵只能是字串。建議但不強制要求物件中的鍵是獨一無二的。物件以花括號<code><b>{}</b></code>包裹。多個鍵-值對之間使用逗號<code><b>,</b></code>分隔。鍵與值之間用冒號<code><b>:</b></code>分隔。</li>
<li>空值：值寫為<code>null</code></li></ul><p>token（6種標點符號、字串、數值、3種字面量）之間可以存在有限的空白符並被忽略。四個特定字元被認為是空白符：空格符、水平制表符、回車字元、換行符。空白符不能出現在token內部（但空格符可以出現在字串內部）。JSON標準不允許有位元組序遮罩，不提供注釋的句法。 一個有效的JSON文件的根節點必須是一個物件或一個陣列。
</p><p>JSON交換時必須編碼為UTF-8。跳脫序列可以為：「\\」、「\"」、「\/」、「\b」、「\f」、「\n」、「\r」、「\t」，或Unicode16進位跳脫字元序列（\u後面跟隨4位元16進位數字）。對於不在基本多文種平面上的碼位，必須用UTF-16代理對（surrogate pair）表示，例如對於Emoji字元——喜極而泣的表情（<span><span>U+1F602</span></span> <span>😂</span> <span>FACE WITH TEARS OF JOY</span>）在JSON中應表示為：
</p>

<p>JSON的格式描述可以參考RFC 4627。
</p>
<h2><span id=".E5.BA.94.E7.94.A8.E9.A2.86.E5.9F.9F"></span><span id="应用领域">應用領域</span></h2>
<h3><span id=".E5.85.83.E6.95.B0.E6.8D.AE.E5.92.8C.E6.9E.B6.E6.9E.84"></span><span id="元数据和架构">元資料和架構</span></h3>
<p>JSON文字的官方媒體類型是雙引號，這一點在大多數現代的安裝中都採用了這種類型。由於傳統原因，許多服務提供商、瀏覽器、伺服器、Web 應用程式、庫、框架和API也支援非官方的 MIME 類型 或內容類型。值得注意的例子包括谷歌搜尋API，雅虎，臉書的API，Lift，和Dojo Toolkit。JSON 架構指定一種基於 JSON 的格式，用於定義用於驗證、文件和互動控制的 JSON 資料的結構。它為給定應用程式所需的 JSON 資料以及如何修改該資料提供協定。JSON架構基於XML架構（XSD）中的概念，但基於JSON。與在 XSD 中一樣，相同的序列化/反序列化工具可用於架構和資料，並且它是自描述的。它在IETF的網際網路草案中指定，目前為2020-12年草案，於2021年1月28日發布。有幾個驗證器可用於不同的程式語言，每個驗證器都有不同程度的一致性。標準副檔名為 .json。JSON 標準不支援物件參照，但存在基於 JSON 的物件參照的 IETF 草案標準。
</p>
<h3><span id="WEB.E5.BC.80.E5.8F.91"></span><span id="WEB开发">WEB開發</span></h3>
<p>JSON最開始被廣泛的應用於WEB應用的開發。不過目前JSON使用在JavaScript、Java、Node.js、C#應用的情況比較多，PHP等開發的WEB應用主要還是使用XML。
</p>
<h3><span id="NoSQL.E6.95.B0.E6.8D.AE.E5.BA.93"></span><span id="NoSQL数据库">NoSQL資料庫</span></h3>
<p>相對於傳統的關係型資料庫，一些基於文件儲存的NoSQL非關係型資料庫選擇JSON作為其資料儲存格式，比較出名的產品有：MongoDB、CouchDB、RavenDB等。
</p>
<h2><span id=".E4.B8.BE.E4.BE.8B"></span><span id="举例">舉例</span></h2>

<p>這種JSON格式也被不少遊戲（如Minecraft）或應用軟體用來當作的部分資料儲存的格式：
</p>

<h2><span id=".E5.AE.89.E5.85.A8.E5.95.8F.E9.A1.8C"></span><span id="安全問題">安全問題</span></h2>
<h3><span id=".E8.AF.BB.E5.8F.96JSON"></span><span id="读取JSON">讀取JSON</span></h3>
<p>由於JSON是JavaScript的子集，所以一般都會使用<code>eval()</code>作為讀取資料的方式，如果是針對可靠的資料來源，在不支援原生JSON解析的瀏覽器上面這是最快速的方法。然而由於eval方法同樣可以執行任意的JavaScript代碼，因此當資料來源不可靠時則可能產生安全問題。如下面的例子，直接用eval執行時會跳轉：
</p>

<p>其中一種防止不安全程式碼出現的解決辦法，是通過瀏覽器原生支援的<code>JSON.parse(str)</code>方法讀取JSON資料，目前已經得到大部分主流瀏覽器的支援（IE8+，Firefox 3.5+，Chrome4+/Safari4+，Opera10+），在不支援原生JSON物件的瀏覽器上面可以使用<code>parseJSON</code>方法進行讀取，<code>parseJSON</code>採用解析器驗證讀入的程式碼是否真的是JSON程式碼，這樣就更安全。但由於這是用類比的方式讀取，速度上會比<code>eval()</code>慢。
</p>
<h3><span id=".E8.B7.A8.E7.AB.99.E5.AD.98.E5.8F.96.E5.95.8F.E9.A1.8C"></span><span id="跨站存取問題">跨站存取問題</span></h3>
<p>另外一個安全上的問題則是跨站請求偽造（Cross-site request forgery，簡稱CSRF或XSRF）。這個問題在Javascript中的狀況是，由於Javascript採用了稱為「沙盒」的機制，這種機制限制Javascript引擎僅能引入同一個站點的程式碼，因而某種程度上提高了安全性。
</p>
<h2><span id=".E8.88.87.E5.85.B6.E4.BB.96.E6.A0.BC.E5.BC.8F.E7.9A.84.E6.AF.94.E8.BC.83"></span><span id="與其他格式的比較">與其他格式的比較</span></h2>
<h3><span id="XML">XML</span></h3>
<p>JSON與XML最大的不同在於XML是一個完整的標記語言，而JSON不是。這使得XML在程式判讀上需要比較多的功夫。主要的原因在於XML的設計理念與JSON不同。XML利用標記語言的特性提供了絕佳的延展性（如XPath），在資料儲存，擴充及進階檢索方面具備對JSON的優勢，而JSON則由於比XML更加小巧，以及瀏覽器的內建快速解析支援，使得其更適用於網路資料傳輸領域。
</p>
<h3><span id="MessagePack">MessagePack</span></h3>
<p>MessagePack宣稱比JSON更短小，快速。
</p>
<h3><span id=".E6.A0.BC.E5.BC.8F.E5.8C.96.E5.B7.A5.E5.85.B7"></span><span id="格式化工具">格式化工具</span></h3>
<p>JSON格式取代了XML給網路傳輸帶來了很大的便利，但是卻沒有了XML的一目了然，尤其是JSON資料很長的時候，會讓人陷入繁瑣複雜的資料節點尋找中。開發者可以使用線上JSON格式化工具，來更方便的對JSON資料進行節點尋找和解析。
</p>
<h2><span id=".E5.8F.83.E8.80.83.E6.96.87.E7.8D.BB"></span><span id="參考文獻">參考文獻</span></h2>

<ol><li>Apple捷徑 （頁面存檔備份，存於網際網路檔案館）</li></ol><h2><span id=".E5.8F.83.E9.96.B1"></span><span id="參閱">參閱</span></h2>
<ul><li>JSONP</li>
<li>AJAX</li>
<li>JavaScript</li>
<li>YAML</li>
<li>HOCON</li></ul><h2><span id=".E5.A4.96.E9.83.A8.E9.80.A3.E7.B5.90"></span><span id="外部連結">外部連結</span></h2>
<ul><li><span title="英語">（英文）</span> JSON（頁面存檔備份，存於網際網路檔案館），關於JSON的規格、檔案，以及在其他語言實做的資訊</li>
<li>JSON中文說明 （頁面存檔備份，存於網際網路檔案館）</li>
<li><span title="英語">（英文）</span> RFC 4627，JSON在RFC裡的規格</li>
<li>JSON格式化工具 (中文) （頁面存檔備份，存於網際網路檔案館）</li>
<li>JSON編輯器 （頁面存檔備份，存於網際網路檔案館）</li>
<li>JSON剖析器（頁面存檔備份，存於網際網路檔案館）</li>
<li>JSON到CSV轉換器 （頁面存檔備份，存於網際網路檔案館）</li>
<li>Minecraft指令─JSON文字格式 （頁面存檔備份，存於網際網路檔案館）</li>
<li>JSON線上格式化工具</li></ul>
**JSON**（**J**ava**S**cript **O**bject **N**otation, /ˈdʒeɪsən/）是由美國程式設計師道格拉斯・克羅克福特構想和設計的一種輕量級資料交換格式。其內容由屬性和值所組成，因此也有易於閱讀和處理的優勢。JSON 是獨立於程式語言的資料格式，其不僅是 JavaScript 的子集，也採用了 C 語言家族的習慣用法，目前也有許多程式語言都能夠將其解析和字串化，其廣泛使用的程度也使其成為通用的資料格式。

## 簡介

JSON 格式是 1999 年《_JavaScript Programming Language, Standard ECMA-262 3rd Edition_》的子集合，所以可以在 JavaScript 以 `eval()` 函式（javascript 通過 eval () 呼叫解析器）讀入。不過這並不代表 JSON 無法使用於其他語言，事實上幾乎所有與網路開發相關的語言都有 JSON 函式庫。

JSON 的基本資料類型：

* 數值：十進位數，不能有前導 0，可以為負數，可以有小數部分。還可以用 `**e**` 或者 `**E**` 表示指數部分。不能包含非數，如 NaN。不區分整數與浮點數。JavaScript 用雙精度浮點數表示所有數值。
* 字串：以雙引號 `**""**` 括起來的零個或多個 Unicode 碼位。支援反斜槓開始的跳脫字元序列。
* 布林值：表示為 `true` 或者 `false`。
* 陣列：有序的零個或者多個值。每個值可以為任意類型。陣列使用方括號 `**[]**` 包裹。多個陣列元素之間用逗號 `**,**` 分隔，形如：`[value, value]`。
* 物件：若干無序的「鍵 - 值對」(key-value pairs)，其中鍵只能是字串。建議但不強制要求物件中的鍵是獨一無二的。物件以花括號 `**{}**` 包裹。多個鍵 - 值對之間使用逗號 `**,**` 分隔。鍵與值之間用冒號 `**:**` 分隔。
* 空值：值寫為 `null`

token（6 種標點符號、字串、數值、3 種字面量）之間可以存在有限的空白符並被忽略。四個特定字元被認為是空白符：空格符、水平制表符、回車字元、換行符。空白符不能出現在 token 內部（但空格符可以出現在字串內部）。JSON 標準不允許有位元組序遮罩，不提供注釋的句法。 一個有效的 JSON 文件的根節點必須是一個物件或一個陣列。

JSON 交換時必須編碼為 UTF-8。跳脫序列可以為：「\\」、「\"」、「\/」、「\b」、「\f」、「\n」、「\r」、「\t」，或 Unicode16 進位跳脫字元序列（\u 後面跟隨 4 位元 16 進位數字）。對於不在基本多文種平面上的碼位，必須用 UTF-16 代理對（surrogate pair）表示，例如對於 Emoji 字元 —— 喜極而泣的表情（U+1F602 😂 FACE WITH TEARS OF JOY）在 JSON 中應表示為：

JSON 的格式描述可以參考 RFC 4627。

## 應用領域

### 元資料和架構

JSON 文字的官方媒體類型是雙引號，這一點在大多數現代的安裝中都採用了這種類型。由於傳統原因，許多服務提供商、瀏覽器、伺服器、Web 應用程式、庫、框架和 API 也支援非官方的 MIME 類型 或內容類型。值得注意的例子包括谷歌搜尋 API，雅虎，臉書的 API，Lift，和 Dojo Toolkit。JSON 架構指定一種基於 JSON 的格式，用於定義用於驗證、文件和互動控制的 JSON 資料的結構。它為給定應用程式所需的 JSON 資料以及如何修改該資料提供協定。JSON 架構基於 XML 架構（XSD）中的概念，但基於 JSON。與在 XSD 中一樣，相同的序列化 / 反序列化工具可用於架構和資料，並且它是自描述的。它在 IETF 的網際網路草案中指定，目前為 2020-12 年草案，於 2021 年 1 月 28 日發布。有幾個驗證器可用於不同的程式語言，每個驗證器都有不同程度的一致性。標準副檔名為 .json。JSON 標準不支援物件參照，但存在基於 JSON 的物件參照的 IETF 草案標準。

### WEB 開發

JSON 最開始被廣泛的應用於 WEB 應用的開發。不過目前 JSON 使用在 JavaScript、Java、Node.js、C# 應用的情況比較多，PHP 等開發的 WEB 應用主要還是使用 XML。

### NoSQL 資料庫

相對於傳統的關係型資料庫，一些基於文件儲存的 NoSQL 非關係型資料庫選擇 JSON 作為其資料儲存格式，比較出名的產品有：MongoDB、CouchDB、RavenDB 等。

## 舉例

這種 JSON 格式也被不少遊戲（如 Minecraft）或應用軟體用來當作的部分資料儲存的格式：

## 安全問題

### 讀取 JSON

由於 JSON 是 JavaScript 的子集，所以一般都會使用 `eval()` 作為讀取資料的方式，如果是針對可靠的資料來源，在不支援原生 JSON 解析的瀏覽器上面這是最快速的方法。然而由於 eval 方法同樣可以執行任意的 JavaScript 代碼，因此當資料來源不可靠時則可能產生安全問題。如下面的例子，直接用 eval 執行時會跳轉：

其中一種防止不安全程式碼出現的解決辦法，是通過瀏覽器原生支援的 `JSON.parse(str)` 方法讀取 JSON 資料，目前已經得到大部分主流瀏覽器的支援（IE8+，Firefox 3.5+，Chrome4+/Safari4+，Opera10+），在不支援原生 JSON 物件的瀏覽器上面可以使用 `parseJSON` 方法進行讀取，`parseJSON` 採用解析器驗證讀入的程式碼是否真的是 JSON 程式碼，這樣就更安全。但由於這是用類比的方式讀取，速度上會比 `eval()` 慢。

### 跨站存取問題

另外一個安全上的問題則是跨站請求偽造（Cross-site request forgery，簡稱 CSRF 或 XSRF）。這個問題在 Javascript 中的狀況是，由於 Javascript 採用了稱為「沙盒」的機制，這種機制限制 Javascript 引擎僅能引入同一個站點的程式碼，因而某種程度上提高了安全性。

## 與其他格式的比較

### XML

JSON 與 XML 最大的不同在於 XML 是一個完整的標記語言，而 JSON 不是。這使得 XML 在程式判讀上需要比較多的功夫。主要的原因在於 XML 的設計理念與 JSON 不同。XML 利用標記語言的特性提供了絕佳的延展性（如 XPath），在資料儲存，擴充及進階檢索方面具備對 JSON 的優勢，而 JSON 則由於比 XML 更加小巧，以及瀏覽器的內建快速解析支援，使得其更適用於網路資料傳輸領域。

### MessagePack

MessagePack 宣稱比 JSON 更短小，快速。

### 格式化工具

JSON 格式取代了 XML 給網路傳輸帶來了很大的便利，但是卻沒有了 XML 的一目了然，尤其是 JSON 資料很長的時候，會讓人陷入繁瑣複雜的資料節點尋找中。開發者可以使用線上 JSON 格式化工具，來更方便的對 JSON 資料進行節點尋找和解析。

## 參考文獻

1. Apple 捷徑 （頁面存檔備份，存於網際網路檔案館）

## 參閱

* JSONP
* AJAX
* JavaScript
* YAML
* HOCON

## 外部連結

* （英文） JSON（頁面存檔備份，存於網際網路檔案館），關於 JSON 的規格、檔案，以及在其他語言實做的資訊
* JSON 中文說明 （頁面存檔備份，存於網際網路檔案館）
* （英文） RFC 4627，JSON 在 RFC 裡的規格
* JSON 格式化工具 (中文) （頁面存檔備份，存於網際網路檔案館）
* JSON 編輯器 （頁面存檔備份，存於網際網路檔案館）
* JSON 剖析器（頁面存檔備份，存於網際網路檔案館）
* JSON 到 CSV 轉換器 （頁面存檔備份，存於網際網路檔案館）
* Minecraft 指令─JSON 文字格式 （頁面存檔備份，存於網際網路檔案館）
* JSON 線上格式化工具
.json