JSON 的語法規則其實很少。資料型別有六種,容器結構只有物件與陣列兩種,剩下幾條規則記得起來。但手動撰寫時還是常出錯,多半是因為習慣了 JavaScript 或 Python 比較寬鬆的寫法。這篇指南整理 JSON 六種資料型別的寫法與語法規則,並附上程式碼範例。
JSON 的文法由 RFC 8259在新分頁中開啟 與 ECMA-404在新分頁中開啟 兩份標準規格定義,兩份規格對語法的描述完全一致。這篇指南以實務範例說明規格規則,也整理手動撰寫時常碰到的錯誤模式與修正方式。
如果你還不確定 JSON 格式是什麼、跟其他格式有什麼差異,可以先看 概觀。這篇偏重語法參考——實際動手寫 JSON 時該注意的事。
手邊的 JSON 檔案想確認語法有沒有問題,可以貼到 JSON 格式化器。語法錯誤會直接標出列號,所有處理都在瀏覽器內完成,資料不會傳到外部。
字串(String)
字串必須用雙引號 " 包住。單引號 ' 跟 backtick(`)在 JSON 標準中不能使用。
{
"greeting": "你好",
"empty": ""
}
逸出序列(Escape Sequence)
字串中需要包含特殊字元或控制字元時,用反斜線(\)逸出:
| 寫法 | 意義 |
|---|---|
\" | 雙引號 |
\\ | 反斜線 |
\/ | 正斜線(逸出為選填) |
\b | 退格(Backspace) |
\f | 換頁(Form feed) |
\n | 換行(Line feed) |
\r | 回車(Carriage return) |
\t | Tab |
\uXXXX | 4 位 16 進位 Unicode 碼點 |
{
"path": "C:\\Users\\Documents",
"message": "第一行\n第二行",
"quote": "他被稱為\"專家\""
}
忘記逸出反斜線是最常見的語法錯誤來源之一。特別是 Windows 檔案路徑或正規表示式中的 \,必須寫成 \\。
U+0000 到 U+001F 的控制字元不能直接放在字串裡,必須逸出。直接打一個真正的 Tab 或換行進字串會造成解析錯誤,要用 \t 和 \n 代替。
Unicode 表示
JSON 預設以 UTF-8 編碼,所以中文字、日文假名或 emoji 可以直接寫進字串。如果需要包含較難輸入的特殊符號、或要避開編碼問題,也可以用 \uXXXX 格式:
{
"direct": "台北",
"escaped": "\u5317\u4eac"
}
數字(Number)
數字不加引號,直接寫。整數、小數(浮點數)、負數、指數表示法(e/E)都支援。
{
"integer": 42,
"negative": -10,
"decimal": 3.14,
"exponent": 1.5e3
}
1.5e3 代表 1500(即 $1.5 \times 10^3$),科學計算或處理大單位數值時會用到。
數字撰寫時要注意以下限制:
- 前導零(leading zero)不合法(
007、012不行,要寫7、12) - 十六進位(
0xFF)或八進位(0o77)不支援 - 小數點前或後不能省略數字(
.5和42.不行,要寫0.5、42.0) NaN(Not a Number)和Infinity不是 JSON 標準數字,解析時會出錯
// 以下全都是 JSON 中無效的數字寫法
007
NaN
Infinity
.5
(註:標準 JSON 沒有註解語法,上面的 // 是說明用的標記。)
大整數的精度限制
JSON 規格本身沒有規定數字的精度範圍,但實務上多數解析器(含 JavaScript 內建的 JSON.parse)使用 IEEE 754 雙精度浮點數(double-precision)來處理數字。
這代表超過 $2^{53}$(= 9,007,199,254,740,992)的 64 位元整數,在解析時低位元會被四捨五入,造成精度損失。
因此,處理 Twitter/X 的 snowflake ID、Discord 的 ID、資料庫中 64 位元整數主鍵(PK)這類超大數字時,API 端以字串而非數字傳回是標準慣例。
{
"safe_id": 9007199254740991,
"snowflake_id": "9007199254740993"
}
在客戶端 JSON.parse 之後要處理 64 位元整數不損失精度,建議以字串形式接收再轉為 BigInt。
布林值(Boolean)
只有 true 和 false 兩個值。必須全部小寫。
{
"isActive": true,
"isDeleted": false
}
True、FALSE、yes、no、1、0 都不是 JSON 的布林值。從 Python(True/False)或 YAML(yes/no)複製資料過來的時候特別容易出錯。
null
表示值不存在或為空值時使用 null。跟布林值一樣,必須全小寫。
{
"middleName": null,
"deletedAt": null
}
空字串 "" 跟 null 意義不同。「有值但內容是空」跟「值本身不存在」是兩種狀態,需要區分時用 null。JavaScript 的 undefined、Python 的 None、Ruby 的 nil 在 JSON 中都不存在,統一以 null 表示。
陣列(Array)
用方括號 [] 包住,元素之間以逗號(,)分隔。陣列是有序的值的清單。
{
"colors": ["red", "green", "blue"],
"scores": [85, 92, 78],
"flags": [true, false, true]
}
空陣列也是合法的。
{
"items": []
}
語法上,一個陣列裡可以混入不同型別的值。
["text", 42, true, null]
但實務上,同一個陣列只放相同型別的資料是慣例。型別混在一起會讓接收端處理資料的邏輯變複雜。
物件(Object)
用大括號 {} 包住,鍵: 值 對之間以逗號(,)分隔。鍵必須是用雙引號 " 包住的字串。
{
"id": 1,
"name": "商品A",
"price": 1500
}
空物件也是合法的 JSON。
{
"metadata": {}
}
JSON 規格中物件沒有鍵的順序。{"a": 1, "b": 2} 和 {"b": 2, "a": 1} 意義相同。實際上多數解析器會維持插入順序,但不該寫依賴鍵順序的邏輯。
重複鍵的注意事項
JSON 標準規格並未嚴禁同一物件內出現重複鍵,但處理重複鍵的方式因解析器庫而異。
{
"name": "Alice",
"name": "Bob"
}
多數解析器會「取後面的值」(Bob),但也有保留第一個值(Alice)或直接報錯的。要確保跨系統互操作性,就不要在物件中製造重複鍵。
巢狀結構(Nesting)
JSON 的表達力來自物件與陣列可以自由巢狀組合。
物件中的物件
需要將相關設定或詳細資訊分層歸組時使用。
{
"user": {
"name": "林小明",
"contact": {
"email": "lin@example.com",
"phone": "0912-345-678"
}
}
}
陣列中的物件
REST API 回應或資料庫查詢結果列表最常用的模式。
{
"users": [
{
"id": 1,
"name": "林小明",
"role": "admin"
},
{
"id": 2,
"name": "陳美玲",
"role": "editor"
}
]
}
物件中的陣列
一筆資料項目包含多個子標籤或列表時實用。
{
"order": {
"id": "ORD-2026-001",
"items": [
{ "product": "筆記型電腦", "quantity": 1 },
{ "product": "無線滑鼠", "quantity": 2 }
],
"tags": ["urgent", "electronics"]
}
}
巢狀結構深過 4~5 層時,人讀起來會困難,程式碼中的存取路徑也會變長。發現巢狀過深時,考慮是否能把資料結構扁平化(flattening)。
JSON 最上層(Root)元素
JSON 文件的最上層通常是物件 {} 或陣列 []。
RFC 8259 標準規格中,字串("hello")、數字(42)、布林值(true)、null 等單一原始值也是合法的最上層,但實務上產生和交換的 JSON 文件幾乎都是以物件或陣列開頭。
{
"status": "success",
"code": 200
}
[1, 2, 3, 4, 5]
空白字元與壓縮格式
JSON 解析器會忽略 token 之間的空白字元(空格、Tab、換行)。所以下面三種寫法在語法上意義完全相同。
壓縮(Compact)格式:
{"name":"林小明","age":30}
排版(Formatted)格式:
{
"name": "林小明",
"age": 30
}
不規則空白格式:
{
"name" : "林小明" ,
"age" : 30
}
網路傳輸或節省儲存空間時,去除多餘空白的壓縮格式比較有利;開發者自己查看或編輯設定時,有縮排的排版格式讀起來清楚得多。
常見語法錯誤
手動撰寫或修改 JSON 時最常見的錯誤模式整理如下。
1. 尾端逗號(Trailing Comma)
{
"a": 1,
"b": 2,
}
物件或陣列最後一個元素後面多出的逗號,JSON 標準不允許。JavaScript、TypeScript、Python 中尾端逗號很多時候是合法的,從這些語言的程式碼複製過來時最容易被帶入(報 Unexpected token } 錯誤)。定位與刪除的具體步驟,整理在 JSON 尾端逗號。
2. 使用單引號
{'name': '林小明'}
JSON 中鍵與字串值都必須用雙引號 "。單引號 ' 是語法錯誤。
3. 鍵名漏加引號
{name: "林小明"}
JavaScript 物件字面量中鍵名可以省略引號,但 JSON 中鍵名必須用雙引號包住。
4. 寫註解
{
// 這行註解會造成語法錯誤
"name": "林小明"
}
標準 JSON 規格沒有定義註解語法。寫 //、/* */、# 都會讓解析器直接拒絕。需要註解的設定檔案得用支援 JSONC 或 JSON5 延伸格式的環境。替代方法有更完整的整理,見 JSON 註解方式。
5. 使用 undefined 和 NaN
{
"value": undefined,
"result": NaN
}
JavaScript 的 undefined 和 NaN 不是 JSON 標準值。值不存在時用 null 表示,數值計算失敗時用 null 或字串 "NaN" 明確標示。
6. 沒有引號的獨立字串
hello
沒有引號包住的普通詞語不是合法的 JSON。要當作字串使用就必須寫成 "hello"。
這些常見錯誤的原因與修法,整理在 JSON 解析錯誤的原因與修法。
快速參考(Quick Reference)
JSON 所有可用資料型別與要點整理:
| 資料型別 | 範例 | 撰寫注意事項 |
|---|---|---|
| 字串(String) | "你好" | 必須雙引號 "。控制字元需 \ 逸出 |
| 數字(Number) | 42、3.14、-10、1.5e3 | 前導零不行、十六進位不行、NaN/Infinity 不行 |
| 布林值(Boolean) | true、false | 只有小寫有效(True、FALSE 不行) |
| null | null | 只有小寫有效(None、undefined 不行) |
| 物件(Object) | {"key": "value"} | 鍵必須雙引號字串。尾端逗號禁止 |
| 陣列(Array) | [1, 2, 3] | 方括號。元素間逗號分隔。尾端逗號禁止 |
JSON 格式化與語法檢查
JSON 寫完之後,傳給解析器之前先做語法檢查比較安全。漏掉閉括號、忘逸出、尾端逗號,在大檔案中用肉眼找不容易。
JSON 格式化器 貼上就能同時完成縮排排版與語法有效性檢查。有語法錯誤時會明確標示出錯的列號與原因。
在終端機或命令列環境(CLI)中想快速驗證的話,可以用以下指令:
# Python 標準函式庫
python3 -m json.tool < file.json
# jq 工具
jq . file.json
兩個工具在語法正確時會輸出排版好的 JSON,語法錯誤時會顯示出錯位置。Python 通常隨系統安裝就有,jq 則有色彩標示、輸出較易讀。更多排版與格式化的實務方法,見 JSON 排版線上工具。
JSON 撰寫慣例
JSON 語法本身是固定的,但為了方便操作有一些慣例:
- 縮排用 2 格空格最常見
- 結構相似的物件之間,鍵的順序保持對齊
- 鍵名統一用 camelCase 或 snake_case 其中一種
- 能用扁平結構表達的,避免過深巢狀
常見問題
JSON 可以寫註解嗎?
不可以。標準 JSON 規格(RFC 8259)中沒有 //、/* */、# 等註解語法。設定檔案需要註解的話,可以用支援 JSONC 或 JSON5 延伸規格的工具,或用 "_comment": "說明文字" 這種慣例性的 dummy 鍵來暫代。
JSON 最後一個元素後面可以放逗號嗎?
不行。物件或陣列的最後一個元素後面放逗號,幾乎所有 JSON 解析器都會報語法錯誤(SyntaxError)。從程式語言的陣列字面量複製過來的時候要特別注意。
JSON 的鍵名一定要用雙引號包住嗎?
是的,一定要。不能像 JavaScript 物件那樣寫 {name: "Alice"},也不能用單引號 {'name': 'Alice'}。必須寫成 {"name": "Alice"}。
發生 JSON 解析錯誤時,怎麼快速定位位置?
貼到 JSON 格式化器 會顯示出錯列號與錯誤訊息。在終端機環境中,python3 -m json.tool < file.json 也能立刻顯示含列號的錯誤資訊。
總結
- 字串必須用雙引號
"包住,特殊字元用反斜線(\)逸出 - 數字不加引號直接寫,前導零、
NaN、Infinity不允許 - 超過 $2^{53}$ 的 64 位元整數 ID 建議以字串形式傳輸以避免精度損失
- 布林值(
true、false)和null必須全小寫 - 物件
{}的鍵必須是雙引號包住的字串 - 陣列
[]和物件{}最後一個元素後面不留尾端逗號(trailing comma) - 寫完的 JSON 可以用 JSON 格式化器 在瀏覽器中安全地排版與語法檢查

