← 返回 JSON 工具

JSON 差異比對

最後更新:2026年10月2日

比較兩份 JSON 文件,只看到真正不同的地方。因為比較是結構化的,調整鍵的順序或重新格式化不會產生任何差異;報告依路徑列出每一處真實改動,全部在瀏覽器中完成。

結構化而非文字 忽略鍵的順序 在瀏覽器中執行 無需上傳 開源(MIT)

結構化比較能看到什麼

兩份文件會先被解析,然後一起走訪。只有資料本身的差異會被回報:某一側存在而另一側沒有的鍵、發生變化的某個值,或型別改變的值——數字變成字串,物件變成陣列。空白與鍵的順序完全不參與比較,因為解析之後它們已經不存在了。

型別變化只在發生的那個路徑上回報一次,而不會展開成底下每個葉節點的一筆刪除加一筆新增。當整棵子樹改變了形狀時,這讓報告仍然可讀。

為什麼這不是文字行比對

文字差異——也就是 git diff 顯示的那種——比較的是行。對 JSON 來說這常常會誤導。當 JSON 由不同工具或不同版本的函式庫產生時,重新縮排,或把同樣的鍵以不同順序輸出,都是很正常的,而行比對會把它變成滿畫面的改動,儘管資料完全相同。

下面兩份文件是同一份文件。行比對會回報四行改動,而本工具不回報任何差異:

{"a": 1, "b": 2}

{
  "b": 2,
  "a": 1
}

反過來也成立,而這正是有用的地方:鍵名裡改動一個字元,或某個數字從 3 變成 4,都只會顯示為一處改動,而不會被格式化雜訊淹沒。

如何閱讀路徑表示法

每一處改動都會以路徑的形式回報。$ 是文件根;點號進入物件鍵,方括號用於陣列索引。所以 $.settings.indent 是 settings 裡的 indent 鍵,$.features[2] 是 features 陣列的第三項,而 $["weird key"] 表示一個不是簡單識別字的名稱。這套寫法與 JSON Pointer 風格一致,報告裡的路徑可以直接貼到其他 JSON 工具中使用。

差異比對無法告訴你什麼

常見問題

鍵的順序會影響比較結果嗎?

不會。兩份文件在比較前都會先被解析,物件的鍵依名稱比對而非位置。因此,重新格式化文件,或以不同順序輸出鍵,都會得到空的差異結果,這是正確的,因為資料本身沒變。

為什麼在陣列開頭插入一項會顯示這麼多差異?

陣列是依位置比對的,幾乎所有結構化差異工具皆如此。在長陣列開頭插入一項,會把後面每個元素的索引都往後推一位,於是它們都被回報為修改,儘管值只是位移了。沒有可比對的鍵,就無法知道哪些項目是被插入而非被改動。如果陣列元素帶有穩定的 id,請先依該 id 排序兩側再比較。

如果有一側不是有效的 JSON 會怎樣?

比較會停止,並顯示解析器本身的錯誤訊息,同時標示是左側還是右側出錯。兩側都能解析之前無法一起走訪,所以不會進行任何比較。

我的 JSON 會被上傳嗎?

不會。兩份文件都在你的瀏覽器中以 JSON.parse 解析,並在記憶體中比較。沒有任何請求攜帶它們,也沒有帳號或伺服器端儲存。你可以先載入頁面再中斷網路,比較依然可用。

它能判斷某個值是被搬移了還是被修改了嗎?

不能。這個工具只回報差異,不產生修補檔。它不會輸出 JSON Patch 文件,也不會偵測從一處搬移到另一處的值;你會看到的是舊路徑上的一筆刪除,加上新路徑上的一筆新增。

可以比較帶註解或尾隨逗號的 JSON 嗎?

不可以。比較使用的是與本站其他工具相同的嚴格解析器,JSON5、註解與尾隨逗號都會被拒絕。如果某份文件解析失敗,請先用格式化工具或驗證器查看出錯位置。

需要把 JSON 變成表格?JSON 轉 CSV 可以做到。發現錯誤?聯絡我們。