JSON 差異比對
最後更新:2026年10月2日
比較兩份 JSON 文件,只看到真正不同的地方。因為比較是結構化的,調整鍵的順序或重新格式化不會產生任何差異;報告依路徑列出每一處真實改動,全部在瀏覽器中完成。
結構化比較能看到什麼
兩份文件會先被解析,然後一起走訪。只有資料本身的差異會被回報:某一側存在而另一側沒有的鍵、發生變化的某個值,或型別改變的值——數字變成字串,物件變成陣列。空白與鍵的順序完全不參與比較,因為解析之後它們已經不存在了。
型別變化只在發生的那個路徑上回報一次,而不會展開成底下每個葉節點的一筆刪除加一筆新增。當整棵子樹改變了形狀時,這讓報告仍然可讀。
為什麼這不是文字行比對
文字差異——也就是 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 Patch(RFC 6902)文件,也不偵測搬移的區塊。搬移的值會表現為舊路徑上的刪除加上新路徑上的新增。
- 值以精確方式比較。對解析器來說
1和1.0是同一個數,但1和"1"不同,而缺失的鍵與明確設為null的鍵也不同。
常見問題
鍵的順序會影響比較結果嗎?
不會。兩份文件在比較前都會先被解析,物件的鍵依名稱比對而非位置。因此,重新格式化文件,或以不同順序輸出鍵,都會得到空的差異結果,這是正確的,因為資料本身沒變。
為什麼在陣列開頭插入一項會顯示這麼多差異?
陣列是依位置比對的,幾乎所有結構化差異工具皆如此。在長陣列開頭插入一項,會把後面每個元素的索引都往後推一位,於是它們都被回報為修改,儘管值只是位移了。沒有可比對的鍵,就無法知道哪些項目是被插入而非被改動。如果陣列元素帶有穩定的 id,請先依該 id 排序兩側再比較。
如果有一側不是有效的 JSON 會怎樣?
比較會停止,並顯示解析器本身的錯誤訊息,同時標示是左側還是右側出錯。兩側都能解析之前無法一起走訪,所以不會進行任何比較。
我的 JSON 會被上傳嗎?
不會。兩份文件都在你的瀏覽器中以 JSON.parse 解析,並在記憶體中比較。沒有任何請求攜帶它們,也沒有帳號或伺服器端儲存。你可以先載入頁面再中斷網路,比較依然可用。
它能判斷某個值是被搬移了還是被修改了嗎?
不能。這個工具只回報差異,不產生修補檔。它不會輸出 JSON Patch 文件,也不會偵測從一處搬移到另一處的值;你會看到的是舊路徑上的一筆刪除,加上新路徑上的一筆新增。
需要把 JSON 變成表格?JSON 轉 CSV 可以做到。發現錯誤?聯絡我們。