JSON 格式化與驗證工具
貼上 JSON 即可美化排版、壓縮成單行或排序鍵值。若無法解析,工具會顯示解析器停下的行號與欄位,並在出錯處下方加上指標,即使是 3,000 行的回應中少了一個逗號,也能在幾秒內找到。
0 個字元 · 0 個字詞 · 0 行
0 個字元 · 0 個字詞 · 0 行
完全在此瀏覽器分頁中執行,您的文字不會被上傳或儲存。
JSON 值的類型
RFC 8259 僅允許這些值。物件與陣列可以巢狀嵌套,其餘皆為末端值。
| 類型 | 範例 | 規則 |
|---|---|---|
| 物件 | {"id": 7, "tags": ["a"]} | 鍵必須是雙引號字串;成員以逗號分隔,最後一個成員後面不可有逗號。 |
| 陣列 | [1, "two", null] | 任意值的有序清單,允許混合類型。 |
| 字串 | "caf\u00e9 \"quoted\"" | 只能使用雙引號;控制字元必須跳脫;\u 跳脫使用四位十六進位數字。 |
| 數字 | -12.5e3 | 僅限十進位:可有負號,不可有前導零,可有小數與指數。不可使用 NaN 或 Infinity。 |
| true、false、null | true | 小寫,不加引號。 |
剖析器會拒絕的內容
下列每個輸入,都是在建置本頁時交給格式化工具所使用的同一個 JSON.parse 測試的。
| 輸入 | 問題 | JSON.parse |
|---|---|---|
{"a": 1,} | 結尾逗號 | 拒絕 |
{'a': 1} | 單引號字串 | 拒絕 |
{"a": 1 /* note */} | 註解 | 拒絕 |
{a: 1} | 未加引號的鍵 | 拒絕 |
{"n": NaN} | NaN 不是 JSON 數字 | 拒絕 |
{"n": 012} | 前導零 | 拒絕 |
{"n": 0x1F} | 十六進位數字 | 拒絕 |
JSON 字串中的跳脫字元
| 字元 | 在 JSON 中的寫法 |
|---|---|
| 雙引號 | "\"" |
| 反斜線 | "\\" |
| 換行(LF) | "\n" |
| Tab | "\t" |
| 歸位(CR) | "\r" |
| 控制字元 U+0001 | "\u0001" |
| 正斜線(跳脫為選用) | "/" |
| 非 ASCII 字母(不需跳脫) | "é" |
有效 JSON 文件必須遵守的規則
JSON 由 RFC 8259 定義(實質內容與 ECMA-404 相同)。一份文件就是單一值:物件、陣列、字串、數字、true、false 或 null。物件的鍵一律是以雙引號包住的字串。字串只能使用雙引號,且必須跳脫引號、反斜線,以及 U+0020 以下的所有控制字元;因此字串中的 Tab 和換行要寫成 \t 與 \n。RFC 8259 也規定系統之間交換的 JSON 必須使用 UTF-8。
數字採十進位:不可有前導零,不可使用十六進位,不可使用 NaN 或 Infinity,前面也不能加正號。此格式不支援註解,也不允許結尾逗號。這後兩條規則造成了實務上大部分的錯誤,因為 JavaScript 物件字面值、JSON5 和許多設定檔都允許這兩種寫法。下方的對照表是將每種常見錯誤餵給格式化工具所用的同一個解析器而得出的。
美化排版、壓縮、排序
美化輸出會加入換行與縮排,讓結構更易閱讀;兩個空格是 JavaScript 專案中最常見的風格,四個空格則是 Python 的 json.dumps(indent=4) 常用的選擇,而 Tab 可讓每位讀者自行決定寬度。壓縮會移除所有不影響內容的空白,可縮小 API 傳輸的資料量,也能讓文件變成單行,方便放進記錄檔或環境變數。
排序鍵會以字母順序遞迴排列每個物件的成員。JSON 物件依定義是無序的,所以排序不會改變語意,但能讓來自不同系統的兩份文件更容易比對。請注意,解析時數字會變成 JavaScript 的雙精度浮點數:超過 2^53(9,007,199,254,740,992)的整數,例如某些資料庫 ID,在重新格式化時會失去精確度,因此請將這類值保留為字串。
將 JSON 轉成其他格式
格式化後的文件更容易閱讀,但有時你需要的是另一種形式。使用 JSON 轉 CSV 可以把物件陣列變成試算表,而資料格式轉換則能在 JSON、XML、YAML 與 CSV 之間轉換整份檔案。
常見問題
- 為什麼含有註解的 JSON 無法通過格式化?
- 標準 JSON 沒有註解語法,RFC 8259 是刻意省略的。請移除註解,或是在讀取該檔案的工具支援時,改用 JSONC 或 JSON5 格式。
- JSON 錯誤訊息中的「Unexpected token」是什麼意思?
- 解析器遇到了不該出現在該位置的字元,例如單引號、} 前面的結尾逗號,或沒有加引號的鍵。顯示的行號與欄號就是指向該字元。
- 排序鍵值會改變我的資料嗎?
- 不會。JSON 中物件成員的順序沒有意義,因此排序後的文件是等價的。陣列的順序有意義,所以絕不會被更動。
- 為什麼格式化後很長的數字變了?
- JavaScript 以 64 位元浮點數儲存數字,只有在 2^53 以內才能精確表示整數。更大的 ID 在解析時會被四捨五入;請以字串傳送,才能保留每一位數字。
- 可以直接格式化 JSON 檔案而不用貼上嗎?
- 用任何文字編輯器開啟檔案,全選後貼到這裡即可。幾十 MB 的超大檔案,在文字方塊顯示時可能會讓分頁變慢。