← 全部文章

什麼是 JSON?JSON 格式、語法與檔案的完整指南

JSON(JavaScript Object Notation)是通用的資料交換格式。學習它的六種資料型別、讓 JSON 嚴格的文法規則、.json 檔案用在哪、以及如何在各種語言中解析 JSON。

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。不帶引號、不支援十六進位字面值,也沒有 NaNInfinity

42
3.14
-7
1.5e10

5. 布林(Boolean)

只有小寫的 truefalse。JSON 不接受 TrueFalseyesno10 作為布林值。

true
false

6. Null

表示「值不存在」。寫作小寫 null

null

JSON 檔案是什麼?(以及 .json 檔案格式)

一份 JSON 檔案(有時被打成 jason file)是一個包含單一 JSON 值的純文字檔 —— 最常見的是物件或陣列。.json 檔案格式就是符合 RFC 8259 的 UTF-8 文字,依慣例使用 .json 副檔名。既然是純文字,就不需要專門的檢視器。

如何打開 JSON(或 .json)檔案:任何文字編輯器都可以 —— VS Code、Notepad、TextEdit、Sublime、nano。同一個問題有很多種問法 —— how to open json fileshow to open a .json filehow do i open a json filehow 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_extractjson_each,以及在 JSON 欄位上索引的產生欄位。
  • MySQL —— 原生 JSON 欄位型別,加上路徑運算式與 JSON_TABLE 用於把 JSON 值當作列來結合。

兩條實用提醒對它們都適用:大整數經過用戶端驅動可能會遺失精度;JSON 規範沒有定義鍵的標準順序 —— 如果你需要決定性比較或雜湊,請用 RFC 8785(JCS)

常見 JSON 錯誤

即使是經驗豐富的開發者也會寫出不合法的 JSON。最常見的錯誤:

  • 最後一個元素後多出的尾隨逗號
  • 把雙引號寫成單引號
  • 未加引號的鍵
  • JSON 中夾雜 JavaScript 註解
  • Python 風格的值,如 TrueFalseNone

如果你的 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 PointerRFC 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 的工具