跳到主要內容
楓葉工具箱 ToolMaple

開發最後更新:

JSON 格式化

貼上擠成一行的 JSON 馬上排整齊;有語法錯會標出第幾行。

貼上含 \uXXXX 的 JSON(Python 的 ensure_ascii、PHP 沒加 JSON_UNESCAPED_UNICODE 的輸出),按「格式化」就會轉回中文。

什麼是 JSON?

JSON(JavaScript Object Notation)是 2001 年由 Douglas Crockford 推廣的輕量資料交換格式,靈感來自 JavaScript 物件字面值。它的優勢是人類可讀、機器易解析、與語言無關——所以 2010 年後成為 Web API 的事實標準(取代過去的 XML)。

JSON 只支援 6 種類型:object(鍵值對 {})、array(陣列 [])、string(字串,必須雙引號)、number(整數或小數)、boolean(true / false)、null。沒有 comment、沒有 trailing comma、沒有單引號——這是 JSON 「嚴格」的代價。

這頁把你貼上的文字丟給瀏覽器內建的 JSON.parse(),再用 JSON.stringify() 印回來,不是用正規表達式猜你的文件長什麼樣。所以在這裡「格式化」與「驗證」是同一件事:要嘛文字是合法 JSON,你拿到的是真正的解析器看到的那份資料;要嘛不是,你拿到解析器放棄的位置。

JSON 規定 token 之間的空白沒有意義,所以格式化版與壓縮版是同一份文件的兩種樣子,不是兩份不同的資料。

格式化、壓縮、樹狀檢視:哪個模式對應哪件事

  • 格式化(預設 2 空格):要進版本庫的檔案用這個。跟 npm、Prettier 與同事產出的格式一致,diff 才不會整份變紅。
  • 4 空格:不少後端與行動端專案的慣例,巢狀深的時候好追。以你要貼進去的那個檔案為準,不是以自己的習慣為準。
  • Tab:縮排下拉選單的第三個選項,團隊規範用 Tab 或希望每個人自己決定顯示寬度時選它。
  • 壓縮:去掉所有不影響語意的空白與換行。要塞進 shell 參數、環境變數、資料庫欄位,或只吃單行的設定欄位時用。
  • 樹狀檢視:拿來讀,不是拿來產出。每個值都帶型別標籤,一眼看出「該是數字的欄位傳成字串」;容器會顯示有幾個子項,點 key 可複製它的 JSONPath。
  • 只想驗語法:按「格式化」看有沒有紅框。沒有紅框就代表整份解析得過。

實際會用到的場合大致是這些:

  • API 除錯:從 Postman / 瀏覽器 DevTools / curl 拿到一行壓縮 JSON,貼進來美化看欄位
  • 壓縮成單行:把開發用的 pretty JSON 壓成單行貼進設定檔(package.json、tsconfig.json 等)或 CLI 參數
  • 格式檢查:寫好的 JSON 想驗語法,錯誤框會標出第幾行第幾欄與錯誤原因,並把那一行列出來
  • Log 分析:把 server log 中的 JSON 抽出來貼進來,快速定位欄位
  • 學習用:看別人的 JSON 結構(如 OpenAPI spec、tsconfig、package-lock)想理清楚層級

怎麼讀剛抓到的 API 回應

  1. 複製回應本體。Chrome 與 Firefox 的開發者工具都在 Network 面板:點那個請求,開 Response 分頁,複製原始文字。
  2. 貼進上面的輸入框,按「格式化」。跳出紅框通常是兩種情況:連 header 一起複製到了,或那支 API 回的根本是 HTML 錯誤頁而不是 JSON。
  3. 切到「樹狀檢視」,把不看的分支收起來。型別標籤最快抓到 API 的老套路:ID 傳成字串、布林傳成 "false" 這個字串、空陣列傳成 null。
  4. 點你要的那個 key,JSONPath 就進了剪貼簿,可以直接貼給 jq、測試斷言,或那段要一路走到該欄位的程式碼。
  5. 下面的「最近 5 筆」會留下剛才處理過的輸入與縮排設定,比對前後兩版回應時點一下就還原。紀錄存在你瀏覽器的 localStorage,換裝置或清掉瀏覽資料就沒了。

JSON 解析不過,怎麼修

先看錯誤框標的第幾行第幾欄(紅底的那個字元),按「在輸入框選取錯誤位置」讓游標跳過去,再往前看幾個字元。解析器報的是它發現不對的地方,不是你打錯的地方。依出現頻率排序,兇手是這幾個:

  • 單引號:JSON 字串必須雙引號 "...",用 ' 會錯。寫 JS / Python 字典習慣的人最常踩
  • 結尾多逗號(trailing comma):{"a": 1, "b": 2,} 在 JS 合法,JSON 不合法
  • 沒引號的 key:{a: 1} 是 JS 物件,JSON 要寫{"a": 1}
  • 單行註解:JSON 不支援 // 或 /* */。需要註解就用 JSON5 或 JSONC(VS Code 用的格式)
  • 未跳脫的特殊字元:字串內的 " 要寫成 \"、換行寫 \n、反斜線 \\

看不出問題時,再檢查三個比較隱形的:

  • 彎引號:文字經過 Word、聊天軟體或簡報再貼回來," 常常變成 “ 與 ”。把引號重打一次就好。
  • 開頭那個看不見的字元:Windows 編輯器留下的 BOM 會排在第一個大括號前面,讓解析器在位置 0 就失敗。把 { 前面的東西全刪掉再貼一次。
  • 那其實不是 JSON:出現 True、None 或單引號,代表你複製到的是 Python 字典印出來的樣子,改用 json.dumps() 輸出。

結果怎麼帶到該去的地方

結果區右上角的「複製」會複製整份輸出;在樹狀檢視點 key 則只複製那一條路徑。

  • 貼進編輯器:貼格式化版,不要貼壓縮版。review 的人看的是 diff,整份擠成一行的檔案,改一個字也只會顯示「這一行變了」。
  • 貼進終端機:先壓縮,再把整串包在單引號裡,讓 shell 不去動裡面的雙引號,例如 curl -d '{"id":1}' -H 'Content-Type: application/json'。Windows PowerShell 的引號規則不同,用檔案比用行內字串安全。
  • 貼進環境變數或單行設定:用壓縮版。JSON 值裡要有換行,只能寫成字串裡的 \n。
  • 要傳給別人之前:先把 token、金鑰與個資拿掉。你貼在這頁的東西留在自己的瀏覽器裡,但你轉出去的那一份不會。

同一份文件在其他語言與資料庫裡

每個執行環境都有自己的格式化方式,肯接受什麼、印出什麼並不一致。

  • JavaScript、TypeScript:JSON.stringify(value, null, 2) 就是這頁做的事;第三個參數傳數字是空格數,超過 10 會被規格壓回 10。
  • Python:json.dumps(obj, indent=2),或在終端機跑 python -m json.tool file.json。兩個預設值常讓人踩雷:ensure_ascii 會把中文轉成 \uXXXX,要傳 ensure_ascii=False 才留原字;模組也收也吐 NaN 與 Infinity,這兩個 JSON 根本沒有,要可攜就加 allow_nan=False。
  • PHP:json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE)。少了第二個旗標,中文一樣會被寫成 \uXXXX,解得開但沒人看得懂;貼進本頁按「格式化」就會轉回中文。
  • 命令列:jq . 美化、jq -c . 壓縮,兩者都是串流處理,大到瀏覽器分頁開不起來的檔案靠它。
  • PostgreSQL:json 型別原樣保留你的文字,包含空白、key 順序與重複的 key;jsonb 會解析成二進位,空白消失、key 順序不保證、重複 key 只留一個,jsonb_pretty() 可以再排回來。沒有非要原始位元組不可,就選 jsonb。
  • Log 管線:一行一份 JSON 的檔案(JSON Lines 或 NDJSON)整份並不是一份合法 JSON,貼進來不會過,要一行一行貼。
  • 編輯器:VS Code 在 tsconfig.json 與自家設定檔接受註解與結尾逗號,因為它當成 JSONC。這份寬容不包括 package.json,npm 是照嚴格規則解析的。

跟鄰居格式的取捨:

  • JSON:嚴格、機器友善、所有語言都有原生解析器。API 傳輸首選
  • YAML:人類友善(縮排表示層級)、支援 comment。常用於 CI / CD(GitHub Actions、GitLab)與 Kubernetes config。但縮排敏感,容易踩雷
  • TOML:人類友善 + 嚴格定義。Rust 的 Cargo.toml、Python 的 pyproject.toml 採用

限制與隱私

本工具的所有解析與格式化都在你的瀏覽器內完成,JSON 內容不會傳到任何伺服器。可安心貼上含 API key、token、個資的 JSON,本站不會看到也不會記錄。

數字會被改掉。JavaScript 的解析器把每個 JSON 數字都變成 64 位元浮點數,超過 9007199254740991 的整數會被四捨五入,很長的小數也可能尾巴不一樣。資料裡有大型 ID 或金額時,請從原始文字讀值,並要求產出方用字串傳。

還有兩件事會被默默改掉。重複的 key 只會留下最後一個,RFC 8259 明講這個行為各家解析器不一致;長得像非負整數的 key 會被排到其他 key 前面,因為 JavaScript 物件就是這樣列舉的。在意這兩件事的時候,把輸出當成一種檢視,而不是原檔的替代品。

檔案大小。全部在同一個瀏覽器分頁裡跑,很大的文件會把分頁卡住,樹狀檢視又更重,因為每個值都是一個節點。超過幾 MB 請改用串流工具。

這是語法檢查,不是 schema 驗證。一份完全合法的 JSON,還是可能不符合你要送過去的那支 API。必填欄位、型別與允許值要靠 JSON Schema 驗證器或該服務自己的文件。

常見問題

看起來明明沒錯,為什麼解析不過?

幾乎都是這五種:結尾多一個逗號、用單引號當字串、key 沒加引號、寫了 // 或 /* */ 註解,或是從 Word、聊天軟體、簡報貼過來的彎引號。五種在 JavaScript 原始碼或 Python 字典裡都合法,在 JSON 裡都不合法。紅色錯誤框除了瀏覽器原本的訊息,還會標出第幾行第幾欄,把那一行與前後各一行列出來、解析器停下來的字元塗成紅底,按「在輸入框選取錯誤位置」游標就會跳過去。從那裡往前看一兩行,真正打錯的地方通常就在解析器停下來之前。

格式化和壓縮差在哪?會不會弄壞資料?

差別只有空白。格式化加上換行與縮排讓人看得懂層級,壓縮把所有不影響語意的空白與換行去掉讓體積最小。JSON 規定 token 之間的空白沒有意義,所以兩顆按鈕互轉幾次,資料完全一樣。傳輸用壓縮版,螢幕上讀格式化版。

我貼進去的 JSON 會上傳嗎?

不會。這頁呼叫的是你裝置上瀏覽器內建的 JSON.parse 與 JSON.stringify,貼上的文字不會離開這個分頁,沒有任何請求帶著它出去,也不會留在任何伺服器上,關掉頁面就沒了。所以含 token 或客戶資料的 API 回應可以放心貼,不過能先刪掉用不到的欄位還是比較好。

為什麼我的長數字 ID 格式化之後就變了?

JavaScript 把 JSON 裡的每個數字都解析成 64 位元浮點數,只有到 9007199254740991 為止的整數能精確表示。19 位數的 snowflake ID 或 bigint 主鍵已經超過這個上限,進來的時候就被四捨五入,印回去的自然是被改過的值。正確解法在產生資料那一端:大型識別碼請用 JSON 字串傳。只是要讀值的話,直接在原始文字裡搜尋,不要相信格式化後的輸出。

同一個物件裡出現兩個一樣的 key 會怎樣?

RFC 8259 說物件內的名稱「應該」唯一,但沒有禁止重複,並且明講重複時各家解析器的行為不一致。瀏覽器的 JSON.parse 會保留最後出現的那一個、安靜地丟掉前面的,所以格式化後你只會看到一個。如果你在追一個「值不見了」的 bug,先在原始文字裡搜尋那個 key,再判斷是不是伺服器沒送。

格式化會把我的 key 順序打亂嗎?

一般不會,普通字串 key 會照原本的順序印回來。例外是長得像非負整數的 key,例如 "2" 與 "10":JavaScript 物件一律把這種 key 排在最前面並依數值由小到大列舉,所以用 ID 當 key 的對照表會變成排序過的。資料本身沒變,但如果 key 的順序對你有意義,請以原始文字為準。

JSON 可以寫註解嗎?

JSON 本身不行,文法裡沒有註解,寫了 // 或 /* */ 整份就不合法,package.json 或嚴格的 API 都會拒絕。要給人手動編輯的檔案有兩種超集合:JSONC 加上註解,也是 VS Code 在 tsconfig.json 與自家設定檔接受的格式;JSON5 再加上結尾逗號、免引號 key 與單引號。要送進 API 之前,都要先還原成純 JSON。

怎麼拿到某個巢狀欄位的路徑?

切到「樹狀檢視」再點那個 key,頁面會依它在文件裡的位置複製一段 JSONPath 形式的字串,例如 $.data.items[0].id。陣列索引與不是單純識別字的 key 一律用中括號,所以含空白或連字號的 key 會寫成 ["user-id"] 而不會把路徑弄壞。複製到的字串可以直接餵給 jq、JSONPath 查詢或你自己的程式碼。

JSON 裡的 \u6953\u8449 這種字怎麼轉回中文?

貼進上方輸入框按「格式化」就好,輸入框下方也有一顆範例鈕可以先試。\uXXXX 是 JSON 字串裡的 Unicode 跳脫寫法,解析器讀進來就是原本的字,本頁印回來時不再跳脫,所以 \u6953\u8449 會變回「楓葉」。這種輸出通常來自 Python json.dumps 預設的 ensure_ascii=True,或 PHP json_encode 沒加 JSON_UNESCAPED_UNICODE,要從源頭改就是調這兩個選項。emoji 這類字會寫成兩組 \u,例如 \uD83C\uDF41,一樣轉得回來。

多大的檔案撐得住?

沒有固定上限,受限的是你瀏覽器分頁的記憶體,實際能吃多大看裝置。幾 MB 在筆電上格式化不成問題;到幾十 MB 就可能在渲染時卡住,而且樹狀檢視比文字模式更重,因為每個值都會產生一個 DOM 節點。log 檔與資料庫匯出這種規模,用 jq 這類串流的命令列工具比較實際。

資料來源

  • IETF,RFC 8259:JSON 資料交換格式(文法、以 UTF-8 作為交換編碼,以及重複名稱行為不確定的警告)。
  • MDN,JSON.parse()與JSON.stringify()(這頁呼叫的兩個函式,含縮排參數與上限 10)。
  • json.org(Douglas Crockford 的一頁式文法鐵路圖,以及對應的 ECMA-404 標準)。
  • PostgreSQL 的 json 與 jsonb、Python 的 json 模組、VS Code 的 JSONC 行為,各以該專案自己的文件為準,版本之間可能改變。

相關工具

隱私:JSON 由你自己的瀏覽器用 JSON.parse() 與 JSON.stringify() 解析與輸出,不會上傳、不會記錄、也不會存在任何伺服器上,工具區塊另外對錄影分析做了遮罩。分析只知道這一頁被看過,看不到內容。