toolfree

JSON 格式化工具

在瀏覽器中格式化、壓縮並驗證 JSON,會指出語法錯誤的行號與欄位,也可排序鍵名。你貼上的內容不會上傳。

在你的瀏覽器中執行

格式化其實就是驗證

要把 JSON 排版,就必須先解析它,所以任何能幫你排好版的工具,其實已經告訴你這份文件是否合法。 上面的工具每按一次鍵就重跑一次:只要右邊持續產生結果,這份 JSON 就是合法的。

若不合法,訊息會指出解析器放棄的行號與欄位。那是錯誤被「發現」的位置,未必是錯誤發生的位置 ——第 12 行少了一個逗號,通常會回報在第 13 行的開頭,因為那才是第一個接不下去的符號。

四種常見的「不是 JSON」

大多數「JSON 格式錯誤」其實是合法的 JavaScript,這正是混淆的來源。JSON 是嚴格的子集:

寫法為什麼不合法
{name: "x"}鍵名必須是雙引號字串
{'name': 'x'}JSON 不接受單引號
{"a": 1,}結尾多餘的逗號是語法錯誤
// 說明JSON 沒有註解,任何位置都不行

NaNInfinityundefined 同樣不存在,它們是 JavaScript 的值,在 JSON 裡沒有對應的表示法。 JSON 的數字是有限的十進位數,可以帶指數。

大整數在來回轉換中會失真

JSON.parse 產生的是 JavaScript 數字,也就是 IEEE-754 雙精度浮點數。超過 2^53 − 1 (9007199254740991)的整數會無聲地失去精度:

JSON.parse('{"id": 9007199254740993}').id  // 9007199254740992

X(Twitter)的 snowflake ID、Discord ID,以及 64 位元的資料庫主鍵都落在這個範圍,這也是為什麼 使用它們的 API 會把 id 序列化成字串。如果重新格式化之後 id 差了 1,原因就在這裡,而且是解析器 造成的,不是格式化造成的。這類值請保持字串形式。

排序鍵名

在 JSON 規格裡物件的鍵沒有順序意義,但實務上每個解析器都會保留原順序。要比對兩份資料相同、 順序不同的文件,把兩邊都排序是最省事的做法。陣列則不會被動到:陣列的順序本身就是資料。

你的資料只留在這裡

解析與輸出都在你的瀏覽器完成。你貼上的內容不會傳送到任何地方——對 JSON 來說這件事比其他格式 更重要,因為 API 的內容經常夾帶權杖、個資與內部識別碼。