JSON 差分

2 つの JSON を貼り付けると、変更されたパスがすぐに表示されます。ボタン操作もアップロードも不要です。

比較ルール

使い方

  1. 古い JSON を「元の JSON」に、新しい JSON を「変更後の JSON」に貼り付けてください。追加・削除・変更されたすべてのパスが入力と同時に表示され、押すボタンはありません。
  2. キーの順序、1 と 1.0、1e0 と 1、\u00e9 と é は差分ではありません。比較は構造で行います。整形やキー順の変更を確認したい場合は、テキスト差分ツールを使ってください。
  3. 「差分をコピー」で一覧全体を持ち出せます。各行は +、-、~ の後にパスと完全な値が続き、チケットやメールにそのまま貼り付けられます。

例

2 つの文書

【元】
{"order":"A-2026-001","customer":{"name":"佐藤","city":"東京"},"total":1299.5,"paid":false}

【変更後】
{"order":"A-2026-001","customer":{"name":"佐藤","city":"大阪"},"total":1399.0,"paid":true,"coupon":"WELCOME10"}

差分

+ $.coupon "WELCOME10"
~ $.customer.city "東京" → "大阪"
~ $.total 1299.5 → 1399.0
~ $.paid false → true
(+1 ~3 −0)

【元】/【変更後】の行は例の見出しです。実際には 2 つの文書をそれぞれの入力欄に入れます。実際に値が変わった箇所だけが表示され、変わっていない注文番号や顧客名は表示されません。キーの順序は差分になりません。

ルール・制限・既知の問題

  • これは構造の差分であり、テキストの差分ではありません。オブジェクトのキー順は無視し、1、1.0、1e0 は同じ数値、"\u00e9" と "é" は同じ文字列として扱います。整形の変更を確認したい場合はテキスト差分ツールを使ってください。
  • 数値は正確な小数として比較し、JavaScript の Number を経由しません。9007199254740993 は正確なまま保たれ、1e400 が Infinity になることもありません。一覧には入力したとおりの数値が表示されます。
  • 文字列はデコード後の値で比較し、標準の JSON 表記で表示します。重複キーは JSON.parse と同様に最後の値が残り、重複が何件あったかを警告で知らせます。
  • 配列は順序を持ちます。挿入と削除を整列するため、先頭に 1 件追加しても「+」は 1 行で済み、後続のすべての項目が変更扱いになることはありません。移動は削除 1 件+追加 1 件として報告し、「配列の順序を無視」するオプションはありません。
  • サブツリー全体の追加・削除は 1 つのパスになります。非常に長い値は画面では「オブジェクト · N キー」「配列 · N 件」と表示しますが、「差分をコピー」には常に完全な値が入ります。
  • 「差分をコピー」が作るのはプレーンテキストの変更一覧(+ / - / ~、パス、完全な値)であり、JSON Patch ではありません。配列の挿入・削除で後続のインデックスがずれるため、単純な JSON Patch では適用できません。
  • パスは $.a.b[0] の形式です。削除された項目は元のインデックスを指し、追加・変更された項目は新しい文書を指します。
  • 制限: 合計 20 万文字を超えると、入力が止まって約 0.6 秒後に結果が更新されます。1 つの文書が 100 万文字を超える場合やネストが 256 階層を超える場合はエラーとして報告し、切り捨ては行いません。整列の上限を超えた配列はインデックスで比較し、その旨を表示します。画面に描画する変更行は最大 400 行ですが、コピーには常に全件が入ります。
  • ファイルのアップロード、URL からの読み込み、JSON Schema や JSONPath のクエリ、履歴、共有リンクはありません。すべてブラウザ内で動作し、何もアップロード・保存されません。
  • 中国語・日本語・韓国語のページでは「全角の約物」が既定でオンです。文字列の外側の約物は ASCII に折りたたみ、文字列の中身は入力したまま保ちます。

2 つの文書を比較したあとによく使われるツールです。