菊丸ツゥルズ

JSON 差分比較

2つのJSONを構造で比較する

変更前・変更後のJSONを貼り付けると、キーパスごとに「追加・削除・変更・同一」を判定します。行単位のテキスト差分と違い、インデントや改行の入れ方、キーの並び順の違いは差分になりません。すべてブラウザ内で処理し、外部へ送信しません。

set は数値・文字列だけの配列に使えます。オブジェクトを含む配列は自動的に index で比較します。

キー名に「.」や「/」を含む場合は pointer が正確です。

比較したい 2 つの JSON を入力して「比較」を押してください。

差分の一覧

比較すると差分をここに表示します。

使い方とAIOクエリ例

APIレスポンスの回帰確認、設定ファイルの環境間比較、スキーマ変更の影響調査などに使えます。入力はブラウザ内だけで処理し、外部へ送信しません。

  • 基本の例: json_diff.html?input={"a":1,"b":2}&input2={"a":1,"b":3,"c":4}&format=json
  • 並び順を無視: json_diff.html?input={"t":["b","a"]}&input2={"t":["a","c"]}&array_mode=set&format=json
  • format=json は機械可読JSON、format=raw~ パス : 変更前 -> 変更後 形式の差分行だけを返します。同じURLなら常に同じ結果になります。

パス表記の対応表

同じ位置を dot 表記と pointer 表記でどう書くかの対応です。pointer(RFC 6901)はキー名に「/」や「~」を含む場合でも一意に表せます。

対象dot 表記pointer 表記
ルート全体(root)(空文字)
キー namename/name
入れ子の opts.levelopts.level/opts/level
配列の2番目tags[1]/tags/1
キー名が a/b["a/b"]/a~1b
キー名が a~b["a~b"]/a~0b

JSON 差分比較は、2つのJSONを「テキスト」ではなく「構造」として突き合わせ、キーパスごとに追加・削除・変更・同一を判定するツールです。行単位のテキスト差分では、インデントを2スペースから4スペースに変えただけ、キーの並び順が入れ替わっただけでも大量の差分として表示されてしまいますが、本ツールはJSONとして解析してから比較するため、そうした見た目の違いは差分になりません。逆に、型が違うだけの値(数値の 1 と文字列の "1")や、キーそのものが無い場合と値が null の場合といった、テキストでは見分けのつきにくい違いは明確に区別します。解析・比較はすべてブラウザ内のJavaScriptで行い、貼り付けたJSONが外部へ送信されることはありません。同じURL・同じオプションなら必ず同じ結果になります。

使い方・サンプル・結果例・注意点

使い方

左の「変更前のJSON(A)」と右の「変更後のJSON(B)」にそれぞれJSONを貼り付け、「比較」を押します。結果には追加・削除・変更・同一の件数サマリと、キーパスごとの差分一覧が表示されます。オプションは3つです。「配列の比較方法」は index(同じ位置どうしを比較)と set(並び順を無視して比較)から選べます。「パスの表記」は dot(a.b[0].c)と pointer(RFC 6901 の /a/b/0/c)から選べ、キー名に「.」や「/」を含む場合は pointer が正確です。「変化のない項目も表示する」にチェックを入れると、同一だった項目も一覧に含めます。JSONとして解析できない場合は invalid_json_a(左)または invalid_json_b(右)のエラーになります。

サンプル入力

変更前 {"name":"kiku","version":1,"tags":["a","b"],"opts":{"debug":false,"level":3}} と 変更後 {"name":"kiku","version":"1","tags":["a","c"],"opts":{"debug":false,"level":5,"extra":null}}

結果例

上のサンプルを既定のオプション(index / dot)で比較すると、追加 1・削除 0・変更 3・同一 3 と表示されます。内訳は、opts.extra が追加(値 null)、opts.level が 3 から 5 へ変更、tags[1] が "b" から "c" へ変更、version が 1 から "1" へ変更(数値から文字列への型変更)です。name と opts.debug と tags[0] は同一なので、既定では一覧に出ません。format=raw では「+ opts.extra : null」「~ opts.level : 3 -> 5」「~ tags[1] : "b" -> "c"」「~ version : 1 -> "1"」の4行が返ります。差分の並び順はキー名の辞書順に固定しているため、同じ入力なら常に同じ順序になります。

注意点

値の比較は型に厳格です。数値の 1 と文字列の "1"、数値の 0 と false は、いずれも「変更」と判定します。キーの並び順は無視するため、{"a":1,"b":2} と {"b":2,"a":1} は同一です。「キーが存在しない」ことと「値が null である」ことは区別し、片側にキーが無ければ追加・削除、両側にキーがあって片方が null なら変更として扱います。配列の set 比較は数値・文字列・真偽値・null だけの配列に限り有効で、オブジェクトや配列を含む配列に set を指定した場合は自動的に index へフォールバックし、その結果を出力の array_mode_applied に記録します(id などのキーで要素を突き合わせる比較には対応していません)。規模の上限はネストの深さ50階層・比較項目20,000件(同一の項目も件数に含みます)・各入力50,000文字で、超えた場合は too_deep / too_many_nodes / too_long のエラーになります。整形や改行の違いは差分になりませんが、JSONとして壊れている場合は比較できないため、必要に応じて先に整形・修復してから貼り付けてください。すべてブラウザ内で処理し、入力値を外部へ送信しません。

こんなときに使えます

  • APIの改修前後でレスポンスを貼り比べ、意図しないフィールドの増減や型変更が起きていないか回帰確認する
  • 開発・ステージング・本番の設定ファイル(JSON)を突き合わせ、環境間で食い違っている項目だけを洗い出す
  • 外部サービスのWebhookペイロードやスキーマが更新されたとき、旧仕様との差分から影響範囲を調べる
  • テストの期待値JSONと実際の出力JSONを比較し、どのキーパスで値がずれたのかを特定する

よくある質問

テキスト差分ツールではJSONの比較に不十分なのはなぜですか?

行単位のテキスト差分は、JSONを「文字の並び」としてしか見ないためです。たとえばインデントを2スペースから4スペースに変えただけ、末尾の改行の有無が違うだけ、キーの並び順が {"a":1,"b":2} から {"b":2,"a":1} に入れ替わっただけでも、テキスト差分では大量の差分として表示されます。中身は同じなのにノイズだらけになり、本当に変わった箇所が埋もれてしまいます。逆に、1 が "1" に変わったような型だけの違いは、テキスト上は引用符の有無という小さな差なので見落としやすくなります。本ツールはJSONとして解析してから構造を突き合わせるため、見た目の違いは無視し、意味のある違いだけを抽出します。用途が違うだけで優劣ではないので、JSON以外のテキストやログの比較にはテキスト差分ツールをお使いください。

数値の 1 と文字列の "1" が「変更」と判定されるのはなぜですか?

JSONでは数値と文字列は別の型であり、受け取る側のプログラムの挙動が変わるためです。APIの改修で version: 1 が version: "1" になると、数値として比較していたコードが動かなくなったり、型定義の検証に失敗したりします。こうした事故はテキストを眺めているだけでは見つけにくいため、本ツールは型が異なれば数値的に等しくても「変更」として報告します。同じ理由で、0 と false、null と "null" もそれぞれ別の値として扱います。

キーが無い場合と、値が null の場合はどう区別されますか?

明確に区別します。片側にだけキーが存在する場合は「追加」または「削除」として報告し、両側にキーが存在していて片方の値が null、もう片方が別の値であれば「変更」として報告します。両側とも null なら「同一」です。たとえば {"x":null} と {} を比較すると x は「削除」になり、{} と {"x":null} なら x は「追加」になります。APIでは「キーごと省略する」ことと「キーはあるが null を返す」ことで受け手の挙動が変わる場合があるため、この2つを混同しないよう分けて表示しています。

配列の比較で index と set はどう使い分けますか?

並び順に意味があるかどうかで選びます。index は同じ位置どうしを比較するモードで、順序が意味を持つ配列(表示順、手順、時系列など)に適しています。ただし先頭に1件挿入されると以降が全部ずれて差分だらけに見えることがあります。set は並び順を無視して比較するモードで、タグや権限IDのように「集合として同じか」を見たい場合に適しています。set は数値・文字列・真偽値・null だけの配列に限り有効で、オブジェクトや配列を含む配列に指定した場合は自動的に index へフォールバックし、その旨を出力の array_mode_applied に記録します。id などのキーで配列要素を突き合わせる比較には対応していません。

「ネストが深すぎます」「比較対象が大きすぎます」と表示されたときはどうすればよいですか?

ブラウザ内で安定して処理できる範囲として、ネストの深さ50階層・比較項目20,000件・各入力50,000文字の上限を設けているためです(比較項目には変化のない項目も含みます)。超える場合は、比較したい部分だけを抜き出して貼り直すのが確実です。たとえばAPIレスポンス全体ではなく data 配下だけ、設定ファイル全体ではなく変更したセクションだけを比較すれば、差分も読みやすくなります。ログや履歴など明らかに不要なフィールドを削ってから貼り付けるのも有効です。

整形がバラバラなJSONや、壊れているJSONも比較できますか?

整形の違いは問題ありません。インデント幅、改行位置、キーの並び順が違っても、JSONとして解析できれば差分にはならないため、そのまま貼り付けて構いません。一方、末尾カンマやシングルクォートなどでJSONとして壊れている場合は解析できず、invalid_json_a(左)または invalid_json_b(右)のエラーになります。その場合は先にJSONを整形・修復してから貼り付けてください。どちら側のJSONに問題があるかはエラーコードで判別できます。

貼り付けたJSONはサーバーに送信されますか?

送信しません。JSONの解析も差分の計算もすべてブラウザ内のJavaScriptで完結し、入力した内容が外部へ送られることはありません。APIレスポンスや設定ファイルには接続情報や個人情報が含まれることがあるため、外部送信しない設計にしています。同じURL・同じオプションであれば常に同じ結果になります。