JSON 格式化程序

使用即時錯誤回饋來驗證、格式化、壓縮和排序 JSON。

免費線上 JSON 格式化程序和驗證程序

JSON 是 APIs 和設定檔的通用語言,但縮小或格式錯誤的 JSON 很難閲讀和除錯。 Dokall 的 JSON 格式化程式會驗證您的輸入,突出顯示語法錯誤,並使用正確的縮排進行漂亮的列印。

您也可以縮小 JSON 以減少有效負載大小。一切都在客户端運行 - 您的 API 密鑰和敏感資料永遠不會接觸我們的伺服器。將此頁面加入書籤,以便在開發過程中快速進行 JSON 偵錯。

什麼是 JSON?

JSON(JavaScript Object Notation,JavaScript 對象表示法)是一種用於結構化數據的輕量級文本格式。它源自 JavaScript 對象語法,但與語言無關——幾乎所有編程語言都能解析和生成 JSON。它已成為 REST API、配置檔案和數據存儲的預設數據格式。

JSON 支持六種數據類型:字符串(雙引號)、數字、布爾值(true/false)、null、數組(有序列表)和對象(鍵值映射)。其簡潔正是優勢——格式本身沒有屬性、命名空間或內置模式。

JSON 語法規則

JSON 對語法要求嚴格。鍵必須是雙引號字符串——單引號和無引號的鍵均無效。字符串必須使用雙引號,不能用單引號。數組或對象最後一個元素後不允許有尾隨逗號。

數字不能有前導零(數字 0 本身除外),也不能以小數點結尾。布爾值是小寫的 true 和 false,不是 True/False 或 TRUE/FALSE。註釋不屬於 JSON 規範——如果檔案含有 // 或 /* 註釋,它就不是合法 JSON(不過部分解析器支持 JSONC 或 JSON5 等擴展)。

標記之間的空白會被忽略,因此你可以通過刪除所有空格和換行來壓縮(minify)JSON,或用縮進美化(pretty-print)以提高可讀性。兩者表示的是相同數據。

常見 JSON 錯誤及修復方法

"Unexpected token" 通常表示逗號、引號或括號位置不對。最常見原因是尾隨逗號——{"name": "test",} 在最後一個屬性後有逗號,這在 JavaScript 中合法但在 JSON 中不合法。

"Unexpected end of input" 表示解析器在所有方括號或花括號閉合之前就到達了字符串末尾。請清點開閉括號。帶括號匹配的編輯器對此很有幫助。

"Bad control character" 通常表示字符串包含未轉義的換行、製表符或其他控制字符。在 JSON 字符串中,換行必須寫成 \n,製表符寫成 \t,反斜槓寫成 \\。

"Duplicate key" 在技術上被 JSON 規範允許,但大多數解析器會使用最後一個值並靜默丟棄前面的值,這可能導致難以排查的 bug。Dokall 的格式化工具會標記重複鍵,便於你發現它們。

JSON 與 XML、YAML 的對比

JSON 緊湊且易於程序解析。它沒有註釋、沒有屬性,類型系統簡單。最適合:API、數據交換、不需要註釋的配置檔案。

XML 較為冗長,但支持屬性、命名空間、模式(XSD)和轉換(XSLT)。它具有自描述性,可表示混合內容(帶內聯標記的文本)。最適合:文檔型數據、SOAP API、對模式要求嚴格的企業系統。

YAML 是 JSON 的超集,語法更簡潔——用縮進代替花括號,支持註釋,並有日期等額外類型。但其顯著空白使編輯易出錯,且部分解析器存在任意代碼執行的安全隱患。最適合:配置檔案(Kubernetes、Docker Compose、CI/CD)、人工編輯的數據。

在 API 響應和程序化數據交換方面,JSON 已基本勝出。對需要人工編輯的配置檔案,YAML 或 TOML 往往更受青睞。

美化 JSON 與壓縮 JSON

美化後的 JSON 使用換行和縮進(通常為 2 或 4 個空格)使結構一目瞭然。更易於閲讀、審查和調試。適合開發階段、文檔,以及存儲在需要關注 diff 的版本控制配置檔案中。

壓縮 JSON 會去掉所有不必要的空白。一個 50 KB 的格式化 JSON 檔案壓縮後可能縮減到 30 KB。在成千上萬次 API 響應中,這能減少帶寬、加快解析並降低成本。適合生產環境的 API 響應、數據庫中存儲的數據以及網絡載荷。

Dokall 的格式化工具可一鍵在兩者間切換。數據完全相同——只改變空白。若還需要按鍵排序以獲得確定性輸出(便於比較兩個 JSON 對象),本工具支持按字母順序排序鍵。

在 API 中使用 JSON

在 API 請求中發送 JSON 時,將 Content-Type 標頭設為 application/json。接收 JSON 時,解析前請確認響應具有該內容類型。大多數 HTTP 客户端會自動處理,但內容類型不匹配是 "unexpected token" 錯誤的常見來源。

對於大型 JSON 載荷,可考慮使用流式解析器,增量處理數據而不是全部載入內存。在 Node.js 中,JSONStream 等庫可解析 GB 級檔案。在 Python 中,ijson 可實現同樣目的。

JSON 本身不原生支持日期、二進制數據或 BigInt 值。日期通常序列化為 ISO 8601 字符串(2024-01-15T10:30:00Z)。二進制數據用 Base64 編碼。超過 JavaScript Number.MAX_SAFE_INTEGER 的大整數應作為字符串發送,以防精度丟失。

常見問題

JSON 代表什麼?
JSON 代表 JavaScript Object Notation(JavaScript 對象表示法)。儘管名稱如此,JSON 與語言無關,幾乎被所有現代編程語言使用。它由 Douglas Crockford 在 2000 年代初提出,並在 RFC 8259 中正式標準化。
JSON 可以有註釋嗎?
不可以。JSON 規範不支持註釋。若配置檔案需要註釋,可考慮 JSONC(帶註釋的 JSON,VS Code 使用)、JSON5、YAML 或 TOML。若收到帶註釋的 JSON,Dokall 的 JSON 修復工具可去除註釋並輸出合法 JSON。
JSON 檔案的最大大小是多少?
JSON 規範沒有定義大小上限。實際限制取決於解析器和可用內存。大多數語言在內存中解析 JSON,因此 1 GB 的檔案至少需要 1 GB 內存。對於非常大的數據集,請使用流式解析器(Node.js 的 JSONStream、Python 的 ijson),或專為大數據設計的格式,如 NDJSON(換行分隔的 JSON)。
JSON 與 JavaScript 對象有什麼區別?
JavaScript 對象是運行時數據結構,可包含函數、undefined、symbol,並可使用單引號或無引號的鍵。JSON 是文本格式——鍵必須用雙引號,值不能是函數或 undefined,也不允許尾隨逗號。JSON.parse() 將 JSON 字符串轉為 JavaScript 對象;JSON.stringify() 則做相反操作。
如何驗證 JSON?
將 JSON 粘貼到 Dokall 的格式化工具中——它會自動驗證並用行號高亮語法錯誤。在程序中,可使用 JavaScript 的 JSON.parse()(無效輸入會拋出錯誤)、Python 的 json.loads(),或在終端運行 jq . yourfile.json。若需模式驗證(檢查數據是否符合預期結構),請使用 JSON Schema。
什麼是 JSON Schema?
JSON Schema 是用於描述 JSON 數據結構與驗證規則的規範。它定義預期類型、必填字段、值約束以及嵌套對象形態。用於 API 請求/響應驗證、表單生成和文檔。常用驗證器包括 Ajv(JavaScript)、jsonschema(Python)和 json-schema-validator(Java)。
如何在終端中美化 JSON?
使用 jq:echo '{"a":1}' | jq . 會輸出帶語法高亮的格式化結果。Python:python -m json.tool file.json。Node.js:node -e "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(0,'utf8')),null,2))" < file.json。在 macOS 上可通過 Homebrew 安裝 jq:brew install jq。
為什麼我的 JSON 無效?
最常見原因是尾隨逗號、單引號字符串、無引號的鍵、註釋,以及未轉義的特殊字符(換行、製表符、反斜槓)。可使用 Dokall 的 JSON 修復工具自動修復這些問題,或粘貼到格式化工具中查看確切的錯誤位置。