FormatArc 的 JSON 格式化器在瀏覽器中顯示排版與語法檢查結果FormatArc 的 JSON 格式化器在瀏覽器中顯示排版與語法檢查結果
作者: FormatArc 編輯部發布日期: 2026-09-02更新日期: 2026-09-02

JSON 格式是什麼:語法檢查、格式化與六種資料型別完整指南

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)
\tTab
\uXXXX4 位 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)不合法(007012 不行,要寫 712
  • 十六進位(0xFF)或八進位(0o77)不支援
  • 小數點前或後不能省略數字(.542. 不行,要寫 0.542.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)

只有 truefalse 兩個值。必須全部小寫。

{
  "isActive": true,
  "isDeleted": false
}

TrueFALSEyesno10 都不是 JSON 的布林值。從 Python(True/False)或 YAMLyes/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. 使用 undefinedNaN

{
  "value": undefined,
  "result": NaN
}

JavaScript 的 undefinedNaN 不是 JSON 標準值。值不存在時用 null 表示,數值計算失敗時用 null 或字串 "NaN" 明確標示。

6. 沒有引號的獨立字串

hello

沒有引號包住的普通詞語不是合法的 JSON。要當作字串使用就必須寫成 "hello"

這些常見錯誤的原因與修法,整理在 JSON 解析錯誤的原因與修法

快速參考(Quick Reference)

JSON 所有可用資料型別與要點整理:

資料型別範例撰寫注意事項
字串(String)"你好"必須雙引號 "。控制字元需 \ 逸出
數字(Number)423.14-101.5e3前導零不行、十六進位不行、NaN/Infinity 不行
布林值(Boolean)truefalse只有小寫有效(TrueFALSE 不行)
nullnull只有小寫有效(Noneundefined 不行)
物件(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 也能立刻顯示含列號的錯誤資訊。

總結

  • 字串必須用雙引號 " 包住,特殊字元用反斜線(\)逸出
  • 數字不加引號直接寫,前導零、NaNInfinity 不允許
  • 超過 $2^{53}$ 的 64 位元整數 ID 建議以字串形式傳輸以避免精度損失
  • 布林值(truefalse)和 null 必須全小寫
  • 物件 {} 的鍵必須是雙引號包住的字串
  • 陣列 [] 和物件 {} 最後一個元素後面不留尾端逗號(trailing comma)
  • 寫完的 JSON 可以用 JSON 格式化器 在瀏覽器中安全地排版與語法檢查