修復 JSON 中未加引號的鍵

像是 name、active、profile 這類看起來像識別字的鍵,在合法 JSON 中也必須加上引號。

為什麼未加引號的鍵會出錯

JavaScript 在物件字面值裡允許不加引號的屬性名。JSON 不行;每個物件鍵都必須是用雙引號包起來的字串。

錯誤範例

{ name: "Ada", active: true }

修正後的 JSON

{ "name": "Ada", "active": true }

為什麼 JavaScript 識別字會像 JSON 鍵

在 JavaScript 物件字面值裡,{ name: "Ada" } 是合法的,因為 name 是合法識別字。JSON 把這個捷徑拿掉,讓解析器對每一個鍵只需要辨識一種形狀 —— 帶引號的字串。這樣文法就夠小,可以在任何語言裡實作。

永遠需要引號的鍵

即使解析器允許裸識別字,仍有不少鍵必須加引號:return、class 這類保留字,含有連字號或點的名稱,以數字開頭的名稱,以及含有合字字元或 emoji 的 Unicode 名稱。對所有鍵都加引號剛好可以避開所有這些邊界情境。

自動修復何時可以安全地把裸鍵加上引號

修復工具只會對出現在鍵位置的裸識別字加引號 —— 也就是緊接在 { 或 , 後面、後面又是 : 的識別字。它不會去動已經加了引號的鍵、值或字串內部的文字,所以文件裡同時混著合法和不合法的鍵時,加引號仍然安全。

JSON5 與 JSONC

JSON5 與 JSONC(VS Code 設定使用的格式)都允許未加引號的鍵與註解。它們適合人工編輯的設定檔,但不適合做為交換格式 —— 永遠不要透過 API 把 JSON5 拿出去,標準客戶端會拒絕。

FAQ

問:為什麼我的 JSON 裡有未加引號的鍵?答:通常是從 JavaScript 物件字面值複製過來,或是某個模板引擎忘了加引號。問:package.json 可以不加引號嗎?答:不行 —— package.json 是嚴格 JSON;只有 tsconfig.json(JSONC)能容忍。