JSON 資料 (.json)

RFC 標準

JavaScript Object Notation (JSON) 是一種輕量且易於閱讀的資料交換文字格式,受到許多程式語言支援,且常用於網頁 API。

將 JSON 轉換為 HTML

免費的瀏覽器端 JSON 轉 HTML 轉換器。在您的裝置上即時轉換檔案。

線上壓縮 JSON

具隱私保障 - 檔案絕不會離開您的裝置

檢查與中繼資料

作業系統與檔案分析工具透過檢查開頭的二進位位元組序列來識別 JSON 檔案:

在這裡選擇或拖放檔案

私密 - 檔案絕不會離開您的裝置

或貼上 Ctrl+V
零網路傳輸隱私保證: 0 位元組上傳至外部伺服器。所有處理皆在本機瀏覽器沙箱中進行。

位元組層級標頭簽章(檔案簽章)

作業系統與檔案分析工具透過檢查開頭的二進位位元組序列來識別 JSON 檔案:

十六進位簽章(偏移量 0):

7B 或 5B

ASCII 表示法: { 或 [

標準化: 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 (目前)YAMLXMLProtocol 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__' 屬性。

歷史起源與里程碑

2017RFC 8259 標準化 UTF-8 作為 JSON 唯一的強制字元編碼。
2013ECMA-404 定義了 JSON 語法,並被許多程式語言與平台所使用。
2001Douglas Crockford 制定 JSON 格式,以實現無狀態的瀏覽器到伺服器資料通訊。

主要優勢與優點

  • 易於閱讀、具自我描述性且簡潔的文字結構。
  • 內建原生解析支援,包含於 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 資料集的記憶體高效逐行串流處理。