JSON Diff(差分)
2つのJSONファイルをブラウザで即座に比較・差分確認。サイドバイサイドのハイライト表示、RFC 6902 JSON Patch出力、タイムスタンプやIDなどのノイズフィールドを無視。100%プライベート、アップロード不要。
詳細オプション
JSON Diffとは?
JSON DiffはJSONのデータモデルに従った2つのJSONドキュメントの構造比較です — キーは順序なし、型は厳格、配列は順序付きまたはキー付きです。テキスト差分(行を比較し、キーの並び替えや空白を差分として報告する)とは異なり、JSON差分は意味的に意味のある結果を生成します。
正規のマシン可読形式はJSON Patch(RFC 6902)で、1つのドキュメントを別のドキュメントに変換する順序付きopsアレイ(add、remove、replace、move、copy、test)です。パスはJSON Pointer(RFC 6901)を使用します。密接に関連するもの:JSON Merge Patch(RFC 7396)— よりシンプルですが「キーを削除する」と「キーをnullに設定する」を区別できません。このツールはRFC 6902を出力します。
JavaScriptでのJSONの深い等価性は見た目より難しいです。JSON.stringify(a) === JSON.stringify(b)はキーの並び替えで失敗し、-0と0(どちらも"0"にstringify)で誤解を招きます。正しい差分は、キーセットのユニオンを使って両方のツリーを並行して走査し、「in」演算子でnullと欠損を区別し、数値の「等しい」が何を意味するか(デフォルトはObject.is、toleranceの場合はイプシロン)を決定する必要があります。
このツールはブラウザ内で完全に実行されます。入力はマシンから離れることはありません。APIレスポンス、内部スキーマ、独自設定に安全です。
隣接するJSONツールで作業しますか?JSONフォーマッターでフォーマット;JSON to YAMLとYAML to JSONで変換できます。
// Two JSON documents that look different but are semantically equal
const a = '{"a":1,"b":2}';
const b = '{"b":2,"a":1}';
// Naive comparison — wrong
JSON.stringify(JSON.parse(a)) === JSON.stringify(JSON.parse(b));
// → false (key order differs)
// JSON Diff (this tool) — correct: key order is irrelevant
// → 0 differences
// JSON Patch (RFC 6902) for { "a": 1 } → { "a": 2 }
// [{ "op": "replace", "path": "/a", "value": 2 }] 主な機能
サイドバイサイド + JSON Patch
1つの差分から2つのビュー:レビュー用のビジュアルハイライト、自動化用のRFC 6902パッチ。
ノイズフィールドを無視
ワンクリックプリセットで /createdAt、/updatedAt、/*Id、/*At、requestId、traceId を除外。カスタム拡張JSON Pointerパターンもサポート。
キーで配列をマッチング
インデックスではなくidフィールドでオブジェクトの配列を比較 — K8sの環境変数、package-lockのエントリ、または論理的に順序なしのリストに対応。
デフォルトで型厳格
1 ≠ "1"。null ≠ 欠損。テストフィクスチャに入った瞬間にバックエンドのシリアライゼーションのずれを検出。
100%ブラウザベース
入力はマシンから離れません。JSONのアップロードなし、JSONのlocalStorage保存なし、貼り付けた内容のアナリティクスなし。
データではなく設定を共有
共有リンクはconfigのみをURLに書き込みます。JSONの入力はローカルに留まります。
例
APIレスポンスのリグレッション
{"user":{"id":1,"name":"Ada","createdAt":"2024-01-01"}} {"user":{"id":1,"name":"Ada Lovelace","createdAt":"2024-02-02"}} 2つの変更(name と createdAt)があります。Ignoreパスに /user/createdAt を追加すると、名前の変更だけが残ります。
設定ファイル監査(キー順序の変更)
{"a":1,"b":2,"c":3} {"c":3,"a":1,"b":2} データは同じで、キーの順序が異なります。JSON Diffはキーの順序を意味的に無関係として扱うため、差分は空になります。
オブジェクトの配列(キーでのマッチング)
[{"id":1,"qty":3},{"id":2,"qty":5}] [{"id":2,"qty":5},{"id":1,"qty":4}] 配列モードを「キーでマッチ」に切り替え、key=id を指定します。アライメントなしでは全要素が変更に見えますが、アライメントありではid=1のqtyのみが変更されます。
JSON Patch出力(RFC 6902)
{"items":[{"id":1,"price":29.99}]} {"items":[{"id":1,"price":24.99}]} JSON Patchタブに切り替えると [{"op":"replace","path":"/items/0/price","value":24.99}] が取得でき、fast-json-patch で適用できます。
使い方
- 1
両方のJSONドキュメントを貼り付ける
元の(左)と変更後の(右)JSONを貼り付けます。ライブ差分は入力中にレンダリングされます;大きな入力(200KB超)は手動の「Diff」ボタンに切り替わります。
- 2
ノイズをフィルタリングする
プリセット(Timestamps / IDs / Trace)をクリックするか、拡張JSON PointerパターンをIgnoreパスに貼り付けて不要なフィールドを除外します。
- 3
必要なビューを選択する
人間によるレビューにはサイドバイサイド、マシン適用可能なopsにはJSON Patch(RFC 6902)を使用します。チームメートに設定を送るには「共有リンク」を使用してください。
よくある差分の落とし穴
キー順序ノイズ(テキスト差分の症状)
差分ツールが {"a":1,"b":2} と {"b":2,"a":1} を異なるものとして報告する場合、JSONdiffではなく行差分を実行しています。JSONキーは順序なしです — このツールはキー順序を自動的に無視します。
diff a.json b.json # text diff: 'everything changed'
JSON Diff (this tool): 0 differences
nullと欠損の混同
{"a":null} と {} は同じではありません。これらを同等として扱うと実際のバックエンドのバグを隠します。
{"a": null} == {} # collapsed by some tools {"a": null} ≠ {} # type-strict diff キーアライメントなしの配列順序
[{id:1},{id:2}] と [{id:2},{id:1}] は論理セットに対して「2つの変更」ではありません。Sequentialはそのように報告します;キーでマッチに切り替えてください。
Sequential diff: 4 modified
Match by key (id): 0 differences
型のずれ(数値 vs 文字列)
バックエンドはIDを一貫性なくシリアライズすることがあります — 42 vs "42"。このツールはこれらを「type」修正としてフラグを立て、早期にずれを発見できます。
{"id": 42} vs {"id": "42"} # serialization bug Diff reports 'modified (type)' with both values
浮動小数点精度
0.1 + 0.2 !== 0.3(IEEE 754)。tolerance=0(デフォルト)では、これはフラグが立てられます。数値的等価を意図する場合は tolerance を 1e-9 に設定してください。
tolerance=0: 0.30000000000000004 ≠ 0.3
tolerance=1e-9: equal
タイムスタンプとUUIDのノイズ
createdAt、updatedAt、requestId、traceIdはリクエストごとに変化します。Ignoreパスのプリセットを使って除外してください。
Diff: 47 modifications (45 are timestamps)
Add /createdAt, /updatedAt, /requestId to Ignore paths → 2 real changes
一般的な使用例
- APIレスポンスのリグレッション
- ステージングと本番のレスポンスを比較;タイムスタンプとリクエストIDを無視して意味のあるペイロード変更のみを表示。
- CIスナップショットテストの失敗
- 失敗したJest/Vitestスナップショットから実際と期待を貼り付け。ノイズをフィルタリングして数秒で本当の変更を発見。
- package-lock / yarn.lockの競合
- 依存関係をnameでアライメントしてマージ競合を解決;キーの順序と無関係なフィールドがノイズになりません。
- K8s / Helmのバリュー監査
- envs、volumeMounts、portsをnameでマッチング。意図しない順序変更と実際のconfig編集を検出。
- i18n翻訳カバレッジ
- en.jsonとzh.jsonを構造的にdiffして、値ノイズなしで欠損または余分な翻訳キーを検出。
- Terraform / CDKプランのレビュー
- 実行間でプラン出力を比較;数値toleranceで浮動小数点演算を処理し、ignoreパスでARNとタイムスタンプを除外。
技術的な詳細
- RFC 6902準拠のパッチ出力
- RFC 6901パスを使った有効なJSON Patch ops(add/remove/replace)を生成。fast-json-patch@3.xとrfc6902 npmパッケージに対して検証済み。
- 反復トラバーサル
- 明示的スタックトラバーサル(再帰なし)で100,000ノードと深度64を上限とし、敵対的な入力でのスタックオーバーフローを防止。
- Object.is数値等価性
- デフォルトの数値toleranceは0 — Object.isを使用するため-0と+0は区別されます。イプシロンベースの等価性にはtolerance > 0を設定してください。
ベストプラクティス
- レビュー前にフィルタリング
- まずIgnoreパスを追加し(タイムスタンプ、ID、トレースフィールド)、その後差分を確認。ノイズの多い差分のレビューは、目を訓練して本当の変更を見逃させます。
- 論理セットにはキーマッチング
- 配列が順序なしセット(envs、ユーザー、依存関係)を表している場合は、キーでマッチングを使用。論理セットのSequential差分はほぼ常に間違っています。
- データではなく共有リンク
- フィルタ設定を同僚に送るには共有リンクを使用 — 機密JSONを共有ドキュメントに貼り付けないでください。URLにはconfigのみが含まれます。
よくある質問
1フィールドしか変更していないのに差分ですべてが変更されたように表示されるのはなぜ?
JSON差分でタイムスタンプとIDを無視するには?
JSON Patchとビジュアル差分の違いは何ですか?
JSON差分はnullと欠損キーを同じものとして扱いますか?
配列はインデックスとキーのどちらで比較されますか?
差分をRFC 6902 JSON Patchとしてエクスポートできますか?
JSON PatchはJSON Merge Patch(RFC 7396)と同じですか?
大きなJSONファイル(10MB超)を比較するには?
このツールはJSONをサーバーに送信しますか?
差分で42と"42"が異なるのはなぜ?
コメント付きJSON(JSONC)やトレイリングカンマ付きJSONをdiffできますか?
idのようなキーでネストされたオブジェクト配列を比較するには?
差分は浮動小数点精度(0.1 + 0.2)を処理しますか?
関連ツール
すべてのツールを見る →Base64エンコーダー&デコーダー
エンコーディングとフォーマット
Base64のデコード・エンコードが無料でオンラインで行えます。リアルタイム変換、UTF-8・絵文字対応。100%ブラウザ上で動作しデータは外部に送信されません。登録不要。
JSONフォーマッター&バリデーター
エンコーディングとフォーマット
無料オンラインJSON整形ツール。ブラウザ上でJSONのフォーマット、構文検証、圧縮を即座に実行。エラー検出、ワンクリックコピー対応。データは端末外に送信されず、100%プライバシー保護。
JSON to YAML コンバーター
エンコーディングとフォーマット
JSONを貼り付けるだけで即座にYAMLを取得。ブラウザ内でリアルタイム変換。K8s・Compose対応、2/4スペースインデント、Norway問題対応自動クォート。100%プライベート、データは送信されません。
URLエンコーダー&デコーダー — URL構造パーサー内蔵
エンコーディングとフォーマット
URLを貼り付けるだけで即座にエンコード・デコード。内蔵URLパーサーがプロトコル・ホスト・パス・クエリパラメータを編集可能なフィールドに分解。encodeURIとencodeURIComponentの2モード対応。完全ブラウザ動作でデータ送信なし。
YAML to JSON コンバーター
エンコーディングとフォーマット
YAMLを貼り付けるだけで即座にJSONを取得。ブラウザ内でリアルタイム変換。K8sマニフェスト・OpenAPI仕様・Helm valuesに対応。100%プライベート、データは送信されません。
進数変換ツール — 2進数・16進数・10進数・8進数
単位変換
無料オンライン進数変換ツール。2進数、8進数、10進数、16進数および任意の基数(2-36)間で数値を瞬時に変換。BigInt対応で桁数制限なし。登録不要・サーバー送信なし、すべての処理がブラウザ内で完結。コピーボタンやコードリテラル出力で開発作業を効率化。