什麼是 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 回應
- 複製回應本體。Chrome 與 Firefox 的開發者工具都在 Network 面板:點那個請求,開 Response 分頁,複製原始文字。
- 貼進上面的輸入框,按「格式化」。跳出紅框通常是兩種情況:連 header 一起複製到了,或那支 API 回的根本是 HTML 錯誤頁而不是 JSON。
- 切到「樹狀檢視」,把不看的分支收起來。型別標籤最快抓到 API 的老套路:ID 傳成字串、布林傳成 "false" 這個字串、空陣列傳成 null。
- 點你要的那個 key,JSONPath 就進了剪貼簿,可以直接貼給 jq、測試斷言,或那段要一路走到該欄位的程式碼。
- 下面的「最近 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 行為,各以該專案自己的文件為準,版本之間可能改變。
相關工具
- Base64 編碼解碼
文字 ↔ Base64 雙向編碼解碼,完整支援 UTF-8 中文與特殊字元。
- URL 編碼解碼
URL 編碼解碼:中文與特殊字元的百分比編碼雙向轉換,支援 encodeURI 與 encode…
- JWT Decode 解碼
JWT 解碼工具:貼上 JSON Web Token 解出 header 與 payload,過…
- Regex 正規表示式測試
輸入 regex pattern 與測試文字,即時標出所有匹配結果、捕獲分組與位置,支援 g、i、m、s、u、y 旗標。
- Markdown 預覽
即時 Markdown 編輯與預覽,支援 GFM(表格、刪除線、checkbox、code block)。
- UUID 產生器
產生 UUID v4(隨機)與 UUID v7(含時間戳排序)通用唯一識別碼,支援批量產生與一鍵複製。
- 雜湊計算
計算文字與檔案的 SHA-1、SHA-256、SHA-384、SHA-512 雜湊值,走瀏覽器原…
隱私:JSON 由你自己的瀏覽器用 JSON.parse() 與 JSON.stringify() 解析與輸出,不會上傳、不會記錄、也不會存在任何伺服器上,工具區塊另外對錄影分析做了遮罩。分析只知道這一頁被看過,看不到內容。
