標準 JSON 的語法很嚴格。它適合 API、日誌、資料庫欄位和系統之間的資料交換,但不允許註解、尾隨逗號、單引號字串,也不允許不加引號的物件欄位名稱。

很多開發者會困惑,是因為真實專案裡的設定檔經常長這樣:

{
  // 開發環境 API 位址
  apiBaseUrl: 'https://api.example.com',
  retryCount: 3,
  features: {
    betaSearch: true,
  },
}

這不是合法的標準 JSON。它更接近 JSON5,或者類似 JSONC 的帶註解設定格式。當你把這類設定複製到 API 請求、資料庫欄位、環境變數或只支援標準 JSON 的工具裡時,這個差別就會變得很重要。

JSON5 增加了什麼

JSON5 是一種更適合人工編寫設定的寬鬆 JSON 語法。常見特性包括:

  • 支援行註解和區塊註解。
  • 物件和陣列允許尾隨逗號。
  • 字串可以使用單引號。
  • 物件欄位名稱在符合識別符規則時可以不加引號。
  • 數字寫法更寬鬆。

這些能力讓設定檔更容易編輯、加註解和程式碼審查。它適合建置工具、編輯器設定、本機腳本和內部設定檔。

標準 JSON 不允許什麼

標準 JSON 保持更小的語法規則,這樣不同語言裡的解析器才能盡量一致。在嚴格 JSON 中:

  • 物件欄位名稱必須使用雙引號。
  • 字串必須使用雙引號。
  • 不允許註解。
  • 不允許尾隨逗號。
  • 頂層內容必須完整符合 JSON 語法。

例如下面這段會在 JSON.parse() 中報錯:

{
  "name": "MyToolster",
  "enabled": true,
}

僅僅是 true 後面的最後一個逗號,就足以讓整個內容變成非法 JSON。

JSON5 和 JSONC 有什麼差別

JSON5 和 JSONC 都是在標準 JSON 基礎上放寬語法,但它們不是同一個契約。

JSON5 是一種明確的寬鬆語法,包含單引號、不加引號的欄位名稱等特性。JSONC 通常指帶註解的 JSON,常見於編輯器設定和工具設定。有些 JSONC 解析器允許尾隨逗號,有些則會根據工具規則拒絕。

所以更穩妥的問題不是「它看起來能不能讀懂」,而是「實際讀取這個檔案的解析器到底支援哪些語法」。

什麼時候可以使用帶註解 JSON

當使用方明確支援 JSON5 或 JSONC 時,帶註解 JSON 是合理的。比如某些編輯器設定、本機工具設定,或專案裡明確說明支援寬鬆 JSON 的解析器。

但下面這些情境通常應該使用標準 JSON:

  • REST API 請求主體。
  • Webhook payload。
  • 會驗證 JSON 合法性的資料庫 JSON 欄位。
  • 瀏覽器裡的 JSON.parse()
  • 只聲明支援標準 JSON 的命令列工具。

在這些情境中,傳送資料前應該移除註解和寬鬆語法。

如何把 JSON5 風格設定轉換成標準 JSON

在把寬鬆設定複製到 API、資料庫或正式環境設定前,可以按這個清單檢查:

  1. 刪除 ///* */ 註解。
  2. 刪除物件和陣列裡的尾隨逗號。
  3. 把單引號字串改成雙引號字串。
  4. 給所有物件欄位名稱加雙引號。
  5. 確認布林值和空值是小寫:truefalsenull
  6. 用嚴格 JSON 格式化工具重新格式化並校驗。

前面的 JSON5 風格範例轉換成標準 JSON 後是:

{
  "apiBaseUrl": "https://api.example.com",
  "retryCount": 3,
  "features": {
    "betaSearch": true
  }
}

常見錯誤提示

當寬鬆 JSON 被當成標準 JSON 解析時,錯誤通常會指向第一個不支援的字元。常見原因包括:

  • Unexpected token /:遇到了註解。
  • Unexpected token }:關閉大括號前存在尾隨逗號。
  • Unexpected token ':使用了單引號字串。
  • Unexpected token a:使用了未加引號的欄位名稱,例如 apiBaseUrl

錯誤訊息不一定會直接說「不支援 JSON5」。它通常只會告訴你哪個字元破壞了標準 JSON 解析。

推薦處理流程

JSON5 或帶註解 JSON 適合留在面向人工維護的設定檔裡。只要這段資料要進入 API 請求、資料庫欄位,或者被瀏覽器原生 JSON.parse() 讀取,就應該先轉換成標準 JSON。

你可以用 JSON 格式化工具 快速檢查內容是否合法。如果 JSON 被放進 URL 查詢參數裡,可以搭配 URL 編碼工具。如果 JSON 是透過 Base64 傳輸的,先用 Base64 工具 解碼,再檢查解碼後的文字是否為標準 JSON。