JSON(JavaScript Object Notation)是一種輕量的文字格式,用來儲存與交換結構化資料。它驅動著絕大多數 Web API、多數應用設定檔以及無數資料庫。如果你見過 REST API 的回應,或開啟過一份 package.json 檔案,你就已經讀過 JSON 了。本指南講清楚 JSON 究竟是什麼、格式長什麼樣,以及它為何成為資料交換的通用語言。
什麼是 JSON?
JSON 的全稱是 JavaScript Object Notation。它由 Douglas Crockford 在 2000 年代初建立,作為一種更簡單的、用於 Web 伺服器與瀏覽器之間交換資料的 XML 替代方案。儘管名字裡有「JavaScript」,JSON 與語言無關 —— 每種主流程式語言都內建了 JSON 解析器。
該格式由兩份國際標準定義:IETF 的 RFC 8259(歷史與關鍵變化)與 Ecma International 的 ECMA-404。兩者講的是同一件事:JSON 是一段 Unicode 字元序列,表示六種資料型別之一,並以 UTF-8 編碼。
JSON 的六種資料型別
JSON 恰好支援六種值型別。理解它們是理解 JSON 格式的基礎。
1. 物件(Object)
用大括號包起來的一組無序鍵值對。鍵必須是字串(雙引號)。值可以是任意 JSON 型別。
{
"name": "Alice",
"age": 30,
"active": true
}2. 陣列(Array)
用方括號包起來的一個有序值列表。
["apple", "banana", "cherry"]3. 字串(String)
用雙引號包起來的一段 Unicode 字元。單引號不是合法的 JSON。
"Hello, world!"4. 數字(Number)
整數或浮點數。JSON 沒有單獨的整數與浮點型別 —— 只有一種 number。不帶引號、不支援十六進位字面值,也沒有 NaN 或 Infinity。
42
3.14
-7
1.5e105. 布林(Boolean)
只有小寫的 true 或 false。JSON 不接受 True、False、yes、no、1 或 0 作為布林值。
true
false6. Null
表示「值不存在」。寫作小寫 null。
nullJSON 檔案是什麼?(以及 .json 檔案格式)
一份 JSON 檔案(有時被打成 jason file)是一個包含單一 JSON 值的純文字檔 —— 最常見的是物件或陣列。.json 檔案格式就是符合 RFC 8259 的 UTF-8 文字,依慣例使用 .json 副檔名。既然是純文字,就不需要專門的檢視器。
如何打開 JSON(或 .json)檔案:任何文字編輯器都可以 —— VS Code、Notepad、TextEdit、Sublime、nano。同一個問題有很多種問法 —— how to open json files、how to open a .json file、how do i open a json file、how do you open a json file、或單純的 open json file —— 答案都一樣:當作文字打 開。想要更可讀的視圖,把內容貼進 JSON 檢視器 看可折疊的樹,或貼進 JSON Fix 工具來格式化。在 macOS 和 Windows 上,雙擊 .json 檔案通常會用預設文字編輯器打開;如果它嘗試在瀏覽器中打開,可以按右鍵選「以…開啟」挑一個編輯器。不需要任何解壓步驟 —— .json 檔不是壓縮檔。
如何建立 JSON 檔案(也常被問為「how to make a json file」):打開任何文字編輯器,寫一個合法的 JSON 值(物件、陣列、字串、數字、布林或 null),並以 .json 副檔名儲存。整個過程就這樣 —— 沒有標頭、沒有 schema 宣告、除了 UTF-8 之外沒有任何強制編碼標記。程式一辨識到該副檔名,就會依 JSON 檔案格式讀取。一個小的 json file example:{ "name": "Ada", "active": true }。
JSON 格式是什麼?(以及相關搜尋 why files are stored in json format):JSON 格式是一種小型、與語言無關的文字格式,用來表示鍵、值、陣列與物件,並帶有一組固定的字面型別。檔案採用這種格式儲存,是因為同一份文件可以被 Python、Go、Java、JavaScript、Rust 與資料庫無翻譯地讀取 —— JSON 是在系統之間搬運結構化資料的最大公約數。
// users.json
[
{ "id": 1, "name": "Alice", "role": "admin" },
{ "id": 2, "name": "Bob", "role": "editor" }
]你大概已經見過的常見 JSON 檔案:
package.json—— Node.js 專案的詮釋資料與相依tsconfig.json—— TypeScript 編譯器設定settings.json—— VS Code 使用者設 定manifest.json—— 瀏覽器擴充功能或 PWA 的 manifest
JSON 資料格式是什麼?
JSON 資料格式有一些嚴格規則,將它與看起來相似的 JavaScript 程式碼區分開:
- 所有鍵必須是雙引號字串。
{ name: "Alice" }是 JavaScript 物件字面值,不是 JSON。 - 字串必須使用雙引號。
{ "name": 'Alice' }不是合法的 JSON。 - 不能有尾隨逗號。
{ "a": 1, }不是合法的 JSON。 - 不允許註解。
// comment與/* block comment */在 JSON 中都不允許。 - 不允許
undefined。 JavaScript 的undefined在 JSON 中沒有對應物。請改用null。
JSON vs. XML:JSON 為什麼勝出
JSON 與 XML 是同一回事嗎?不是 —— 兩者都承載結構化資料,但形態、體積與機制都不同。在 JSON 接管之前,XML 是標準的資料交換格式。同一份資料兩種寫法:
<!-- XML -->
<user>
<name>Alice</name>
<age>30</age>
</user>
// JSON
{ "name": "Alice", "age": 30 }JSON 更緊湊、更易人讀,在 JavaScript 中原生可解析、不需第三方函式庫。對多數使用情境 —— API 回應、設定、訊息傳遞 —— JSON 比 XML 顯著節省頻寬與程式碼量。
JSON 用在哪裡
- REST API:
Content-Type: application/json標頭幾乎標記了每一個現代 Web API 回應。 - 設定檔:
package.json、tsconfig.json、.eslintrc.json、AWS CloudFormation 範本。 - 資料庫: PostgreSQL、MySQL、MongoDB、DynamoDB 都 原生支援儲存與查詢 JSON 欄位或文件。
- 日誌檔: 結構化日誌(用 JSON Lines)讓日誌資料可被 Elasticsearch 等彙整工具機器解析。
- 行程間通訊: 微服務、訊息佇列(Kafka、RabbitMQ)、無伺服器函式都把 JSON 作為預設負載格式。
資料庫中的 JSON
多數現代資料庫都能直接儲存與查詢 JSON,因此文件不必住進獨立的文件資料庫就能保留結構:
- PostgreSQL —— 兩種型別:
json存原文;jsonb存二進位、可索引的表示。用->/->>查欄位、用@>判斷包含;用 GIN 索引在jsonb欄位上為熱路徑建索引。 - MongoDB —— 文件本來就是類似 JSON 的(磁碟上是 BSON)。欄位層級索引與完整的彙總管線都直接作用於文件形態。
- SQLite —— JSON1 擴充(現代 SQLite 已內建)提供了
json_extract、json_each,以及在 JSON 欄位上索引的產生欄位。 - MySQL —— 原生
JSON欄位型別,加上路徑運算式與JSON_TABLE用於把 JSON 值當作列來結合。
兩條實用提醒對它們都適用:大整數經過用戶端驅動可能會遺失精度;JSON 規範沒有定義鍵的標準順序 —— 如果你需要決定性比較或雜湊,請用 RFC 8785(JCS)。
常見 JSON 錯誤
即使是經驗豐富的開發者也會寫出不合法的 JSON。最常見的錯誤:
- 最後一個元素後多出的尾隨逗號
- 把雙引號寫成單引號
- 未加引號的鍵
- JSON 中夾雜 JavaScript 註解
- Python 風格的值,如
True、False、None
如果你的 JSON 解析不了,線上即時修復 —— 該工具會自動修復這些常見問題,並明確告訴你改了什麼。
在程式碼中解析 JSON
每種主流語言都內建了 JSON 支援:
// JavaScript
const obj = JSON.parse('{"name":"Alice","age":30}');
console.log(obj.name); // "Alice"
# Python
import json
obj = json.loads('{"name":"Alice","age":30}')
print(obj['name']) # Alice
# Go
import "encoding/json"
var obj map[string]interface{}
json.Unmarshal([]byte(`{"name":"Alice","age":30}`), &obj)Python 中如何讀取 JSON 檔案(或 read json file in python):傳檔案路徑用 json.load(open('data.json')),已經是字串就用 json.loads(text)。兩者在遇到語法錯誤時都會丟出 json.JSONDecodeError。
在現代系統中選擇 JSON 而非 XML,通常歸結為網路位元組數與解析器支援 —— 每種語言都原生支援 JSON,而 XML 一般還需要第三方函式庫。
你會遇到的常見 JSON 變體
嚴格 JSON 是基準線,但幾個密切相關的方言會經常出現:
- JSONC(帶註解的 JSON) —— 允許
//與/* */註解以及尾隨逗號的 JSON。tsconfig.json與 VS Code 的settings.json都在用。標準解析器會拒絕它;請使用支援 JSONC 的解析器,或先剝掉註解。 - NDJSON / JSON Lines —— 每列一個 JSON 值,列間以
\n分隔。用於串流日誌、機器學習資料集與批次 API。請用JSON.parse逐列解析,而不是一次解析整份檔案。 - JSON Pointer(RFC 6901)—— 用來定位文件內部某個值的路徑語法,例如
/users/0/name。JSON Patch 與 JSON Schema 的$ref用的就是這種路徑格式。
常見問題
JSON 是什麼的縮寫?
JSON 是 JavaScript Object Notation 的縮寫。儘管名字這麼寫,它其實與語言無關 —— 每種主流語言都能讀寫它 —— 由 RFC 8259 與 ECMA-404 定義。
JSON 中的資料型別有哪些?
六種:字串、數字、布林、null、物件與陣列。沒有單獨的整數型別,沒有日期型別,也沒有 undefined。每種型別的實際範例見 JSON 格式化範例。
JSON 與 JavaScript 物件是同一個東西嗎?
不是。JSON 是一種有嚴格規則的文字格式(雙引號鍵、不允許尾隨逗號、不允許註解);JavaScript 物件字面值是程式碼,寬鬆得多。見 JSON vs JavaScript 物件。
怎樣確認 JSON 合法?
用 JSON.parse() 解析它(無效輸入會丟錯),或者跟著 如何校驗 JSON 一步步做,並送進 校驗工具。要強制結構與型別,請用 JSON Schema 描述它。
處理 JSON 的工具
- JSON Fix —— 即時校驗、修復並格式化不合法的 JSON
- 什麼是 JSON Schema? —— 描述並校驗 JSON 資料的結構
- 如何格式化 JSON —— 在 JavaScript、Python、命令列或瀏覽器中美化 JSON
- JSON 格式化範例 —— 涵蓋每種資料型別與真實場景的可複製範例
- JSON Diff —— 比較兩份 JSON 文件並查看差異
- YAML 轉 JSON —— 把 YAML 設定轉換為 JSON 格式