JSON 差分 & パッチ

2つの JSON 文書を構造として比較し、追加・削除・変更されたフィールドを表示し、遷移を表す RFC 6902 の JSON Patch を生成します。変更前と変更後の JSON 文書を貼り付けると、RFC 6902 の操作一覧を出力します。

ブラウザ内でローカルに実行
変更前
変更後
変更点
  • 2つの文書を比較して構造の変更を確認します。
JSON Patch RFC 6902 の操作一覧
Compare two JSON documents to generate a JSON Patch.

配列は添字で比較されます。並び順が変わった配列や、業務固有の識別フィールドを含むパッチは、本番の文書に適用する前に必ず確認してください。

2 つの JSON ドキュメントを比較する手順

左に元のドキュメント、右に編集後のドキュメントを貼り付けて「比較」を押すと、追加・削除・変更された値がパス付きで一覧表示されます。5 万キーのオブジェクト同士では 7,143 件の変更が、走査の順序どおりに並びます。

出力は RFC 6902 の JSON Patch で、1 つ目のドキュメントを 2 つ目に変換します。JSON Pointer のパスを持つ add / remove / replace の配列です。解析と比較はページ内で行われるため何も送信されず、ネットワークが切れても同じように動作します。

  1. 左の欄に比較前、右の欄に比較後のドキュメントを貼り付けます。「サンプルを読み込む」を使うと小さな例が入り、出力の形を先に確認できます。
  2. 「比較」を押すと、一覧の上に追加・削除・変更の件数が表示され、各行には値へのポインタと 120 文字までのプレビューが付きます。
  3. 下のパッチを読みます。インデントされた RFC 6902 の完全なドキュメントで、テストスイート、移行スクリプト、HTTP PATCH リクエストにそのまま貼り付けられます。
  4. 「パッチをコピー」でクリップボードに入り、「クリア」で両方の欄が空になります。解析に失敗した場合は、どちらのドキュメントか(Before JSON / After JSON)とエラー位置が状態行に表示され、直前の結果は破棄されます。

パッチが示すもの、示さないもの

差分とみなされるもの

キーの順序は差分ではありません。{"a":1,"b":2} と {"b":2,"a":1} は 0 件です。数値は JavaScript の倍精度小数として比較されるため 1 と 1.0 は同じ値になり、1e2 は 100 として届き 1 件の変更になります。

型が自動変換されることはありません。1 と "1" は変更、true と 1 も変更です。値が null のキーと存在しないキーは別物で、1 つ目が null、2 つ目に存在しなければ一致ではなく remove /a になります。重複したキーは最後の値が残ります(JSON.parse で読み込むため)。{"a":1,"a":2} と {"a":2} は 0 件です。

配列はインデックスで比較される

出力に move 操作はありません。配列は位置ごとに走査されるため、並べ替えは replace の連続になります。[1,2] と [2,1] なら replace /0 が 2、replace /1 が 1 です。

長さの変化は末尾から出力されます。[1,2,3,4] と [1,2] では /3 を削除してから /2 を削除し、[1,2] と [1,2,3,4] では /2 と /3 を追加します。この順序なら、パッチを上から順に適用しても各操作が有効なままです。

ポインタ、エスケープ、空のキー

各パスは RFC 6901 の JSON Pointer です。スラッシュやチルダを含むキーはエスケープされ、a/b は /a~1b、c~d は /c~0d になります。

空のキーにもポインタが付き、パスは / になります。ルートそのもののパスは空文字なので、ドキュメント全体の置き換えは path "" の 1 操作になります。

比較が実行される場所

解析と比較はページ内で行われます。ツールの読み込みと 5 万キー同士の比較で、ページ自身のアセット以外のリクエストは発生しませんでした。ドキュメントがブラウザの外に出ることはなく、読み込み後はオフラインでも動作します。

JSON パーサーの制約はそのまま当てはまります。2^53 を超える整数は精度を失うため、9007199254740993 と 9007199254740992 は同一と判定されます。20,000 段のネストもエラーなく比較してパッチを生成できました。所要時間は変更件数に比例し、5 万キーで約 0.5 秒・パッチ 511 KB、50 万キーで約 5 秒・5.25 MB でした。本番データに適用する前にパッチを確認してください。

最近使ったツール: