跳至內容

JSON 差異比較

比較兩份 JSON,顯示新增、刪除與變更。

即時

這個工具的用途

JSON Diff 比對兩份 JSON 文件,明確顯示變更內容——新增的鍵、移除的鍵、值的變化——並對每一處差異附上精確的 JSONPath。選擇 object mode 可忽略鍵的順序、進行結構性比對(最常見的用法),或選 text mode 進行嚴格的逐行比對(當你在意空白與格式時)。所有運算都在你的瀏覽器內完成——資料不會上傳。

使用步驟

將 JSON 文件分別貼入兩個面板(或按 Load Example)。結果會顯示在結果面板:綠列表示新增、紅列表示移除、黃列表示變更。關閉 Only differences 可同時看到計數,或從工具列複製為文字、下載。

Input A:

{"name":"devsmiths","version":1,"features":["formatter","validator"],"public":true}

Input B:

{"name":"devsmiths","version":2,"features":["formatter","validator","viewer"],"beta":true}

差異(object mode):

~ $.version           1 → 2
+ $.features[2]       "viewer"
- $.public            true
+ $.beta              true

限制與邊界情況

  • 陣列比對採 位置式——A 的第 i 個元素會對應 B 的第 i 個元素。因此重新排列陣列會顯示為一連串變更。LCS(最長共同子序列)配對在 P1-stretch 規劃中。
  • Text mode 為基本的 最長共同前綴 + 後綴 差異——刪除與新增區塊不會配對成「變更行」,你會看到清楚的「變更前/變更後」,但不是 Myers-quality 的差異。
  • Object mode 會忽略物件鍵順序與不必要的空白(雙邊都會被解析)。Text mode 設計上對空白敏感。
  • 若任一邊在 object mode 解析失敗,工具會顯示橫幅指出錯誤的行/欄——可用 ValidatorRepair 工具修正。
  • JSON Patch(RFC 6902)輸出為 stretch goal——目前工具會輸出人類可讀的差異列表。
  • 延伸閱讀:比對兩份 JSON 檔案詳細說明各種策略(object vs text、語意 vs 位置)。

常見問題

object 比較與 text 比較差在哪?
Object 比較會將雙邊解析為 JSON 值並走訪整棵樹——忽略鍵順序與不必要的空白,並以 JSONPath(例如 $.users[0].name)回報差異。Text 比較則對兩個字串做逐行比對——當格式本身有意義時很有用。
為什麼重新排列陣列會顯示成變更?
陣列比對是位置式——A[0] 對 B[0]、A[1] 對 B[1],依此類推。移動元素因此會在每個受影響的索引顯示為變更,並在尾端額外顯示新增/移除。LCS 配對在 P1-stretch 規劃中;目前的位置式配對能讓輸出穩定可預期。
它會忽略空白嗎?
Object mode 會——它把雙邊解析為 JSON 值,所以縮排、換行與鍵順序都不重要。Text mode「不會」——它逐行比較兩個字串,完全依照你貼上的內容。
新增 / 移除 / 變更怎麼呈現?
綠列加上 + 表示新增,紅列加上 − 表示移除,黃列加上 ~ 表示變更。顏色之外還會附符號,所以對色盲使用者以及在終端機複製貼上時都清楚易讀。
可以輸出 JSON Patch(RFC 6902)嗎?
目前不行——這是 roadmap 項目。今天的差異是以 JSONPath 為鍵的 add/remove/change 操作清單。可從工具列複製或下載為文字。
會上傳任何資料嗎?
不會。比對完全在你的瀏覽器內進行。雙邊輸入會自動儲存到 localStorage 以便重新整理後仍在,但永遠不會離開你的裝置。