JSON、JSON5、JSONC 有什麼差別
結論:三者是嚴格包含關係:JSON 是標準,JSONC 只多註解,JSON5 還多單引號、無引號鍵、尾逗號、十六進位與多行字串。選錯格式的代價通常在「介面不認」而不是「讀不出來」。

結論:資料要跨系統傳輸就用標準 JSON,只在本機給人改的設定才用 JSONC 加註解;需要單引號、尾逗號或無引號鍵名時選 JSON5,並先確認載入它的工具支援。
一句話:JSONC 是 JSON 加註解,JSON5 是 JSON 加一大堆 JavaScript 習慣。
能力對照
| 特性 | JSON | JSONC | JSON5 |
|---|---|---|---|
| 雙引號字串 | ✅ | ✅ | ✅ |
| 單引號字串 | ❌ | ❌ | ✅ |
| 鍵名可不加引號 | ❌ | ❌ | ✅ |
// 行註解 |
❌ | ✅ | ✅ |
/* */ 區塊註解 |
❌ | ✅ | ✅ |
| 尾逗號 | ❌ | ❌ | ✅ |
十六進位數 0xFF |
❌ | ❌ | ✅ |
Infinity / NaN |
❌ | ❌ | ✅ |
多行字串 \ 續行 |
❌ | ❌ | ✅ |
| 標準解析器能讀 | ✅ | ❌ | ❌ |
注意 JSONC 只解決註解。很多人以為「能寫註解的 JSON」都支援尾逗號,實際上 tsconfig.json 裡多一個尾逗號照樣報錯。
三者各自的定位
JSON:交換格式。介面、訊息佇列、資料庫欄位、日誌,只要是機器之間傳,就必須是它。
JSONC:編輯器設定格式。VS Code 的 settings.json、launch.json、tsconfig.json 都能寫註解,因為由編輯器自己解析,不經過 JSON.parse。它沒有獨立 RFC,是微軟主導的事實約定。
JSON5:給人寫的寬鬆超集。設計目標是「讓設定檔寫起來像 JavaScript 物件字面量」。適合 .json5 後綴的建置設定,語法糖最多,但工具鏈支援面最窄。
怎麼選
| 你的情境 | 選擇 |
|---|---|
| 介面請求/回應體 | JSON,唯一選項 |
| 資料庫裡的 JSON 欄位 | JSON,MySQL、PostgreSQL 的 JSON 函式只認標準 |
| 專案設定、要寫註解 | JSONC(若工具支援)或 YAML |
| 想要 JS 風格的寬鬆語法 | JSON5,但要確認載入它的工具支援 |
| 需要給非技術人員改 | YAML,縮排比括號友善 |
一個常被忽略的坑
把 JSONC 檔案當標準 JSON 讀,錯誤訊息往往指向註解,而不是檔案本身有問題:
SyntaxError: Unexpected token / in JSON at position 42
看到 / 報錯,先確認檔案是不是 .jsonc、tsconfig.json 這類允許註解的檔案,別急著刪註解——刪了可能還有尾逗號,一樣報錯。
常見問題
JSONC 和 JSON5 該怎麼選?
只需要註解就用 JSONC,它比 JSON 只多 // 與 /* */,VS Code 的 settings.json、tsconfig.json 都是這種格式。還需要單引號、無引號鍵名、尾逗號、十六進位數或多行字串時才用 JSON5。兩者都依賴工具支援,選之前先確認載入這些檔案的程式能解析。
為什麼 JSONC 不能當成標準 JSON 使用?
JSONC 是事實約定而非獨立 RFC,標準解析器不認註解。用 JSON.parse 讀帶註解的檔案會拋 Unexpected token /,錯誤指向註解而不是資料結構本身。只有由編輯器或專用解析器讀取的設定檔才適合寫成 JSONC。
是否可以直接把 JSON5 檔案發給介面?
不可以。介面、資料庫欄位與訊息佇列都按標準 JSON 解析,JSON5 的單引號、無引號鍵名與尾逗號會被拒絕。JSON5 的定位是本機給人寫的設定,跨系統傳輸前必須轉成標準 JSON。