JSON 資料 (.json)
RFC 標準JavaScript Object Notation (JSON) 是一種輕量且易於閱讀的資料交換文字格式,受到許多程式語言支援,且常用於網頁 API。
將 JSON 轉換為 HTML
免費的瀏覽器端 JSON 轉 HTML 轉換器。在您的裝置上即時轉換檔案。
線上壓縮 JSON
具隱私保障 - 檔案絕不會離開您的裝置
檢查與中繼資料
作業系統與檔案分析工具透過檢查開頭的二進位位元組序列來識別 JSON 檔案:
位元組層級標頭簽章(檔案簽章)
作業系統與檔案分析工具透過檢查開頭的二進位位元組序列來識別 JSON 檔案:
十六進位簽章(偏移量 0):
7B 或 5BASCII 表示法: { 或 [
標準化: RFC 8259 / ECMA-404 / ISO/IEC 21778
技術規格
| 容器架構 | 輕量、基於文字、獨立於語言的資料交換格式 |
| 壓縮 | Gzip、Brotli 與 Zstandard 可以壓縮 JSON 文字;產生的檔案大小取決於資料與設定 |
| 位元組序 | UTF-8 編碼的 Unicode(建議不使用位元組順序記號 / BOM) |
| 色彩空間 | 不適用 |
| 色版與結構 | 六種基本資料類型:object、array、string、number、boolean、null |
| 最大尺寸 | 無限制;僅受限於解析器記憶體與最大字串長度 |
| 透明度 | 不適用 |
| 串流與漸進式 | NDJSON (Newline Delimited JSON) / JSON Lines 支援漸進式串流處理 |
技術比較矩陣:JSON 對比競爭格式
| 技術屬性 | JSON (目前) | YAML | XML | Protocol Buffers |
|---|---|---|---|---|
| 語法複雜度 | 極簡(6 種型別、嚴格語法) | 高(基於縮排、複雜規格) | 高(冗長的結束標籤、命名空間) | 綱要定義的二進位傳輸格式 |
| 解析效能 | 在所有現代語言中皆極快 | 慢(複雜的縮排解析) | 中等至慢(需建構大型 DOM) | 超快(零複製二進位反序列化) |
| 支援註解 | 否(刻意排除以防止中繼資料無限膨脹) | 是(# 註解) | 是(<!-- 註解 -->) | 在 .proto 檔案中支援 |
| 網路酬載大小 | 精簡文字;壓縮結果取決於資料與設定 | 精簡文字 | 冗長文字(大量的標籤重複) | 超精簡二進位 |
常見損壞模式與十六進位修復指南
SyntaxError: Unexpected token , in JSON at position X.
根本原因: 陣列或物件中最後一個項目後面有尾隨逗號,這在 RFC 8259 JSON 中是嚴格禁止的。
修復: 在傳遞給 JSON.parse() 之前,請移除物件鍵與陣列項目中的尾隨逗號。
SyntaxError: Unexpected token ' in JSON.
根本原因: 字串或鍵使用單引號('')而非雙引號("")包覆。
修復: 將所有使用單引號的字串與鍵替換為標準的雙引號字串。
安全性分析與解析器攻擊向量
JSON 僅包含文字且免於直接執行程式碼的風險,但解析不受信任的 JSON 可能導致原型汙染(Prototype Pollution)、ReDoS 或記憶體耗盡。
已知攻擊向量
- 原型汙染:名為 '__proto__' 或 'constructor' 的鍵會修改 JavaScript 應用程式中的 Object.prototype。
- 透過深度巢狀的 JSON 結構(例如 10,000 個開頭括號)導致堆疊溢位阻斷服務攻擊。
- 數值精度遺失:大於 2^53 - 1(9,007,199,254,740,991)的 JavaScript 數字會在無提示的情況下遺失精度。
防禦最佳實務: 絕不要使用 eval() 來解析 JSON。請使用 JSON.parse(),並在遞迴物件合併函式中清理 '__proto__' 屬性。
歷史起源與里程碑
主要優勢與優點
- 易於閱讀、具自我描述性且簡潔的文字結構。
- 內建原生解析支援,包含於 JavaScript 引擎(JSON.parse)及各大程式語言中。
- 嚴格的規格可防止任意程式碼執行。
技術限制與缺點
- 不支援註解、尾隨逗號或循環物件參照。
- 沒有原生二進位類型(二進位資料必須以 Base64 編碼,會使大小增加 33%)。
- 與 Protocol Buffers 或 MessagePack 等二進位格式相比,序列化效率較低。
有趣的技術冷知識
- 道格拉斯・克羅克福特(Douglas Crockford)在原始的 JSMin JSON 工具中加入了軟體授權條款「本軟體應用於善意,而非惡意」。
- JSON 是 JavaScript 語法的嚴格子集,但在 ES2019 之前,原始且未跳脫的 U+2028 與 U+2029 字元在 JSON 中是有效的,但在 JavaScript 字串中則無效。
- Douglas Crockford 發現,在 ECMAScript 5 標準化專用的 JSON.parse() API 之前,早期的網頁瀏覽器可以使用 JavaScript 的原生 eval() 將 JSON 直接轉換為物件。
常見技術問題
為什麼 JSON 不允許註解?
JSON 的語法中不包含註解。不同的實作處理擴充功能與應用程式特定資料的方式可能有所不同,因此僅憑格式本身無法確保互通性。
如何在 JSON 中儲存 64 位元整數而不遺失精度?
JavaScript 的原生 Number 型別是 IEEE 754 雙精度浮點數,精確支援的整數上限僅到 2^53 - 1。64 位元整數(如資料庫 ID 或時間戳記)在 JSON 中必須序列化為字串(例如 '1234567890123456789')。
JSON 與 NDJSON / JSON Lines 有什麼區別?
標準 JSON 將整個酬載包裝在單一根物件或陣列中,要求解析器在評估之前必須載入整個文字。NDJSON(Newline Delimited JSON)使用換行字元(\n)分隔各自獨立且有效的 JSON 記錄,實現了對龐大數 GB 資料集的記憶體高效逐行串流處理。
相關的 JSON 轉換對
將 JSON 資料轉換成 HTML 原始碼,可把原始的結構化鍵值對轉化為易於閱讀、可直接供瀏覽器算繪的網頁文件。
將 HTML 原始碼轉換為 JSON 資料,能將人類可讀的網頁文件轉化為結構化的鍵值對,以便進行程式化處理與 API 接收。
將 SQL 傾印文字指令碼轉換為 JSON 資料匯出,可將僵化的關聯式資料庫資料表轉換為適用於現代網頁應用程式的彈性巢狀物件。
將非結構化的 JSON 文字檔案轉換為結構化的 SQLite 關聯式資料庫,可對大型資料記錄進行快速索引與查詢。
將 Adobe Swatch Exchange 檔案轉換為 Color JSON 結構,可將二進位設計色票轉換成適用於現代網頁應用程式的可讀文字物件。
將 Color JSON 文字資料轉換為 Adobe ASE 二進位色票,搭起網頁端設計代碼與專業桌面排版應用程式之間的橋樑。
將 GIMP Palette 文字檔案轉換為 Color JSON 結構,可讓網頁應用程式直接讀取色票,無需複雜的解析指令碼。
將結構化的 Color JSON 檔案轉換為 CSS 變數,可將原始資料物件轉化為網站的原生樣式屬性。