跳至主要內容
Lizely

JSON 差異

比較兩個嚴謹的 JSON 值結構,並接收在 JSON 指標路徑上確定的新增、移除、變更及型別變更專案。

隱私權:你的檔案不會離開裝置,所有處理均在瀏覽器本機完成。

使用方式

  1. 1.貼上嚴謹的左側與右側 JSON 檔案;格式與物件成員順序可能不同。
  2. 2.檢視並確認每一個新增、移除、變更或型別變更的 RFC 6901 路徑與值。
  3. 3.複製變更清單以供審查,但應用變更前請使用專用補丁實作與測試。

關於JSON 差異

JSON 差異會將兩個嚴謹的 JSON 檔案作為解析資料進行比較,而非格式化文字。貼上左側與右側值,執行比較,檢視簡潔的路徑清單,並複製結構化變更陣列。空白字元與物件成員順序不會產生幹擾,真實的值、型別、鍵與位置陣列變更仍會清晰顯示。

兩側輸入皆使用嚴謹的 RFC 8259 解析。註解、尾隨逗號、未定義、NaN、Infinity、BigInt 語法以及 JavaScript 物件字面量皆被拒絕。雙側可為任何 JSON 值:物件、陣列、字串、數值、布林值或 null。根路徑為空的 JSON 指標,當整個值變更時,會以「根」顯示於人類可讀的清單中。

物件會根據其成員名稱進行比較,不依賴來源順序。鍵值會排序以確保報告結果的決定性。僅出現在右側的鍵會被新增;僅出現在左側的鍵會被移除。雙側皆存在的鍵會遞迴比較。由於 JSON 文字中無法將重複名稱視為獨立專案,因為標準 JSON 解析會在本工具接收物件對映前先處理這些重複專案。

陣列是有序序列,會根據零基位置進行比較。若值從一個索引移至另一個索引,結果可能包含移除、新增或多個變更專案,而非語意上的移動。本工具不會推測專案識別、計算最長公共子序列,或將陣列視為集合。這些政策取決於資料合約,可能隱藏有意義的順序變更。

每個位置都是 RFC 6901 JSON 指標。成員名稱內的斜線會變成 ~1,波浪線會變成 ~0。陣列索引使用十進位索引標籤。根節點用空字串表示,而不是斜線。路徑顯示比較中觀察到差異的位置;它們並不是自動產生的可執行差異或保證執行操作會產生正確文件。

擁有相同 JSON 型別但不同值的原始資料被修改。數字變成字串、物件變成陣列、或 null 變成其他型別則視為型別改變。新增的專案包含右值,移除的專案包含左值,改變的專案包含兩者。當整個成員被新增、移除或改變型別時,物件和陣列子樹可以作為值出現。

JSON 數值會被解析為 JavaScript 數值。超過安全範圍的整數與精細小數差異可能在比較前已被四捨五入。正零與負零視為相同的 JSON 數值。若精確小數表示、重複名稱或任意精度數值有特殊意義,建議使用專門設計的解析器與數值模型進行比較,而非依賴此瀏覽器表示方式。

結果為產品定義的變更清單,並非 RFC 6902 JSON 補丁、JSON 合併補丁、文字統一差異,或架構遷移。結果不會產生移動、複製或測試操作,亦不聲稱移除的值在周圍變更後可被恢復。若變更將自動套用,請使用維護良好的補丁庫與專案特定測試。

每項輸入限制為 500,000 字元,巢狀深度至 50 比較層級,輸出為 5,000 變更。若結果過大,工具將失敗而非截斷。八個外部測試案例涵蓋新增、移除、變更、型別變更、陣列索引、斜線轉義、波浪線轉義及物件順序等情境。額外測試涵蓋巢狀變更與正負零情境。在複製變更清單至日誌或工單前,請先審視敏感的輸入與輸出值。

方法與來源

解析兩個嚴謹的 JSON 值,遞迴比較物件以排序的成員鍵與陣列以位置,分類新增/移除/變更/型別變更專案,將路徑轉為 RFC 6901 JSON 指標,視為物件順序無關,並在超出限制時失敗而非截斷。

常見問題

為何改變物件鍵順序不會顯示差異?
RFC JSON 物件是無序集合。本工具比較成員名稱與值,而非來源文字順序。
為何重新排序陣列會產生多個差異?
陣列是有序的,並會根據位置進行比較。本工具不會臆測項目識別或移動檢測。
複製的輸出是 JSON 補丁嗎?
不是。這是一份以審查為導向的變更清單,包含前後值。它並未實作 RFC 6902 操作或補丁套用語義。