單元 3 · 語法鐵則

不容妥協的規則,與例外在哪裡 — Syntax Rules

JSON 的優點是「機器零歧義」,代價是「人寫起來很嚴格」。 這一單元把會直接報錯的規則一次講完。

鐵則一:所有字串都用雙引號

鍵與字串值一律雙引號。單引號、無引號都不行。

❌ 非法 JSON
{ name: 'Alice' }        # 鍵沒引號 + 值單引號
{ "name": 'Alice' }       # 值單引號
✅ 合法 JSON
{ "name": "Alice" }     # 全部雙引號

鐵則二:沒有註解

JSON 不允許任何註解。//#/* */ 都會直接解析失敗。

❌ 非法 · 想加註解?
{
  // 這行會讓解析失敗
  "a": 1
}
那設定檔怎麼加註解?延伸格式:JSONC(VS Code、tsconfig)、JSON5。 詳見單元 6——那是本課的重點。

鐵則三:沒有尾逗號

物件的最後一個鍵值、陣列的最後一個元素,後面不能有逗號

❌ 非法 · 尾逗號
{
  "a": 1,
  "b": 2,   # ← 最後一項
}
✅ 合法
{
  "a": 1,
  "b": 2
}

注意:JavaScript 的物件/陣列允許尾逗號,但 JSON 不允許——兩者很容易混在一起出錯。

鐵則四:鍵必須是字串

鍵不能用數字、布林或不加引號(即使有些語言的字典允許)。

❌ 非法 · 鍵型別
{ 1: "x" }            # 數字鍵
{ true: "x" }       # 布林鍵
{ a: 1 }             # 無引號鍵
✅ 合法
{ "1": "x",
  "true": "x",
  "a": 1 }

鐵則五:頂層只能有一個值

一個 JSON 文件頂層只能是一個值(通常是一個物件或陣列)。多個值分開寫、或加逗號串接都不行。

❌ 非法 · 多個值
{ "a": 1 }
{ "b": 2 }        # 第二個物件
✅ 合法 · 包進陣列
[
  { "a": 1 },
  { "b": 2 }
]
延伸:「一個檔案想放多筆資料」的痛點,正是 JSON Lines(每行一個 JSON)存在的理由——單元 6 見。

寬鬆的誤區 · What JSON Is NOT

常被誤會可以寫真相
// 註解❌ 非法(JSONC 才行)
單引號 'x'❌ 非法
尾逗號❌ 非法
十六進位 0xFF❌ 非法(JSON5 才行)
NaN / Infinity❌ 非法(JSON5 才行)
undefined❌ 非法
看完這頁你應該能說出:
  • 雙引號鐵則,以及鍵必須是字串。
  • JSON 沒有註解、沒有尾逗號。
  • 頂層只能有一個值。
  • 哪些「常被誤寫」的語法會直接報錯。
  • 「想加註解」要轉向 JSONC / JSON5。

延伸閱讀