JSONC、JSON5、JSON Lines — Extended Formats
純 JSON 設定檔的痛苦:
延伸格式就是在「嚴格」與「人味」之間取平衡。
JSONC(JSON with Comments)= 標準 JSON + 註解(+ 部分工具允許尾逗號)。 它沒有官方規格,而是各家工具約定俗成,由解析器在讀取前「剝掉註解再解析」。
{ // 這是單行註解 "name": "My App", /* 這是多行 註解 */ "port": 8080, // 行尾註解 "debug": true, // 有些工具也允許尾逗號 }
注意「尾逗號」並非 JSONC 的標準共識——VS Code 的 JSONC 允許,其他工具未必。保守起見別寫。
| 工具 | 說明 |
|---|---|
| VS Code | settings.json、tasks.json 實為 JSONC |
| tsconfig.json | TypeScript 設定,可用註解(VS Code 內) |
| jsconfig.json | 同上 |
JSON(嚴格)與 JSONC(含註解)。
看到「JSONC」字樣,代表可以寫註解;看到「JSON」,寫了會標紅。
JSON5 是正式的「JSON for Humans」提案(json5.org), 在 JSONC 的註解之外,還放寬更多語法。設計目標:讓「合法的 JavaScript 物件字面值」幾乎都能直接當 JSON5 用。
{ // 註解 OK unquotedKey: '單引號也可以', // 無引號鍵 + 單引號值 trailingComma: 1, // 尾逗號 OK hex: 0xFF, // 十六進位 inf: +Infinity, // Infinity / NaN leadingZero: 0.5, // 前導零也可以 .5 multiline: "字串可以\n換行" // 多行字串 }
| 語法 | JSON | JSON5 |
|---|---|---|
註解 //、/* */ | ❌ | ✅ |
| 單引號字串 | ❌ | ✅ |
| 無引號鍵 | ❌ | ✅ |
| 尾逗號 | ❌ | ✅ |
十六進位 0xFF | ❌ | ✅ |
前導/尾隨小數點 .5、5. | ❌ | ✅ |
+Infinity / NaN | ❌ | ✅ |
| 字串內多行 | ❌ | ✅ |
JSON Lines(又稱 NDJSON / JSONL)不是 JSON 的「寬鬆化」, 而是一個不同的串流格式:每一行是一個獨立的 JSON 值,行與行以換行分隔。
{ "time": "2026-08-15T10:00:00Z", "level": "info", "msg": "start" } { "time": "2026-08-15T10:00:01Z", "level": "error", "msg": "boom" } { "time": "2026-08-15T10:00:02Z", "level": "info", "msg": "done" }
>> 直接追加,不需重寫整個檔案。tail -f 即時觀看的場景。副檔名常用 .jsonl 或 .ndjson。
| 特性 | JSON | JSONC | JSON5 | JSON Lines |
|---|---|---|---|---|
| 註解 | ❌ | ✅ | ✅ | ❌ |
| 尾逗號 | ❌ | 部分 ✅ | ✅ | ❌ |
| 單引號 / 無引號鍵 | ❌ | ❌ | ✅ | ❌ |
| 官方規格 | ✅ ECMA-404 | ❌ 約定俗成 | ✅ json5.org | ✅ jsonlines.org |
| 主要目的 | 機器交換 | 設定檔加註解 | 人更好寫 | 串流/日誌 |
| 典型代表 | API、傳輸 | VS Code、tsconfig | Babel 等專案設定 | 日誌、匯出 |
.json 嚴格;VS Code 標 JSONC 可寫註解。json5 套件、Python 的 json5、
VS Code 內建 JSONC 解析、jq 讀 JSON Lines 用 --stream 或一行一行餵。