JSON 比較(JSON Diff):2 つの JSON ドキュメントを比較
2 つの JSON を行ではなく構造で比較します。 処理はすべて端末内で完結し、アップロードは一切ありません。
- 入力
- Two JSON documents
- 出力
- Path-level changes · JSON Patch
元の JSON
有効
変更後
有効
差分
6 件の変更
- 変更/version
− 1
+ 2
- 追加/settings/language
+ "ja"
- 追加/users/0
+ {"id":3,"name":"Grace","email":"grace@example.com"}
- 変更/users/1/email
− "ada@example.com"
+ "ada@example.org"
- 削除/users/1
− {"id":2,"name":"Linus","email":"linus@example.com"}
- 型の変更/limit文字列 → 数値
− "100"
+ 100
JSON をテキストではなく意味で比較
この JSON 比較ツールは、2 つの JSON ドキュメントをデータとして比較します。オブジェクトはキーの順序にかかわらずキーごとに対応付けられ、書式やインデントは無視され、すべての違いが正確なパス、変更の種類、変更前後の値とともに一覧表示されます。レコードの配列は id フィールドで対応付けられるので、並べ替えたリストや先頭に挿入した行のせいで全体が変更されたように見えることはありません。結果は RFC 6902 の JSON Patch またはプレーンテキストのレポートとして書き出せます。どちらのドキュメントもブラウザ内にとどまり、何もアップロードされません。
2 つの JSON ファイルを比較する方法
- 左に元の JSON、右に新しい JSON を貼り付けるか、それぞれに
.jsonファイルをドロップします。 - ペインの上に解析エラーが表示された場合は修正してください。行と列が示されます。
- 変更の一覧を確認します。各変更には
/users/2/emailのような JSON Pointer のパスが付いています。ツリー表示に切り替えると、文脈の中で確認できます。 - 配列の要素をキーで対応付けをオンにし、レコードを識別するフィールド(通常は
id)を入力します。 - 追加、削除、変更、型の変更で絞り込み、JSON Patch をコピーするか、テキストレポートをダウンロードします。
JSON にテキスト差分が向かない理由
2 つの JSON ドキュメントは、データとしては同一でもテキストとしてはまったく異なることがあります。ある API はキーを別の順序で返し、あるファイルは圧縮され、もう一方は整形されていて、一方は 1.0、もう一方は 1 と書いている、といった具合です。行単位のテキスト差分チェッカーは、それらをすべて変更として示します。構造的な差分は、まず両方を解析してから値を比較するので、本当の変更だけが報告されます。追加・削除されたキー、変わった値、そして文字列 "42" が数値 42 になったような型の変わった値です。
数値は完全な精度で値として比較されるため、1.50 と 1.5 は等しく、最後の桁だけが異なる 20 桁の ID 2 つは異なるものとして報告されます。JavaScript の数値で比較すると、この違いは見逃されてしまいます。
- 追加
- そのキーまたは配列の要素は、新しいドキュメントにのみ存在します。
- 削除
- そのキーまたは配列の要素は、元のドキュメントにのみ存在します。
- 変更
- 同じ場所、同じ型で、値が異なります。
- 型の変更
- 値が別の JSON の型になりました。たとえばオブジェクトが配列に、数値が文字列になった場合です。
配列の比較:位置で、またはキーで
既定では、配列の要素は位置ごとに比較されます。要素 0 と要素 0、要素 1 と要素 1 です。座標や手順のように順序が意味を持つリストではこれが正解ですが、レコードのリストではそうではありません。先頭にユーザーを 1 人挿入すると、その後のすべてのユーザーが変更されたように見えてしまいます。
配列の要素をキーで対応付けを使うと、代わりに識別用のフィールド(既定では id)で要素を組にします。各レコードは位置にかかわらず同じ id を持つレコードと比較されるので、結果は「ユーザーが 1 人追加され、メールアドレスが 1 つ変わった」となります。対応付けが使われるのは、両側のすべての要素がオブジェクトで、そのフィールドに一意の文字列または数値を持つ場合だけで、それ以外は位置で比較されます。
ツリー表示では、両方のドキュメントを 1 つのアウトラインにまとめて表示します。変更を含む枝は自動的に開き、変更のない枝は折りたたまれたままで、追加は緑、削除は赤、変更された値は「旧 → 新」で示されます。変更のみをオフにすると、周囲の変更のないキーも文脈として表示されます。
パス、JSON Pointer、JSON Patch
各変更の位置は JSON Pointer(RFC 6901)で示されます。/orders/0/total のように、ルートからスラッシュで区切ったパスで、配列の要素は 0 から番号が付き、キー内の ~ と / はそれぞれ ~0 と ~1 と書きます。空のパスはドキュメント全体を意味します。
書き出し形式は JSON Patch(RFC 6902)です。add、remove、replace の操作のリストで、順に適用すると左のドキュメントが右のドキュメントになります。fast-json-patch、Python の jsonpatch、Kubernetes のパッチ機能などのライブラリでそのまま適用できます。配列の削除は、各操作の実行時にインデックスが正しく保たれるよう、大きいインデックスから順に書き出されます。
どちらかのドキュメントを先に整えるには JSON 整形ツールで整形し、結果を YAML や CSV に変換するにはデータ変換ツールを使ってください。
よくある質問
- 2 つの JSON ファイルを比較するには?
- 左に元の JSON、右に新しい JSON を貼り付けるかドロップしてください。すべての違いが、パス、変更の種類、変更前後の値とともに一覧表示されます。
- JSON を比較するとき、キーの順序は関係しますか?
- いいえ。オブジェクトはキーごとに比較されるので、同じキーが別の順序で並んでいても等しいとみなされます。空白とインデントも無視されます。
- 順序が変わった JSON の配列を比較するには?
- 「配列の要素をキーで対応付け」をオンにし、id など各要素を識別するフィールドを入力してください。要素は位置ではなく、その値で組にされます。
- JSON Patch とは何ですか?
- RFC 6902 で定義された JSON Patch は、add、remove、replace などの操作をそれぞれパス付きで並べた JSON 配列です。元のドキュメントに適用すると、新しいドキュメントが得られます。
- 「型の変更」とはどういう意味ですか?
- そのパスの値が別の JSON の型になったということです。たとえば数値が文字列に、オブジェクトが配列になった場合です。たいていは、そのデータを生成した側のバグを示しています。
- 大きな JSON ファイルも比較できますか?
- はい。解析と比較はブラウザ内でローカルに行われるため、一般的なコンピューターなら数 MB のファイルでも 1 秒かからずに比較できます。
- JSON はアップロードされますか?
- いいえ。両方のドキュメントはブラウザ内で解析・比較され、どこにも送信されないので、個人データや秘密情報を含む API レスポンスも安心して比較できます。