JSONファイルの比較と構造的な差分の検出
2つのJSONドキュメントを比較して、追加・削除・変更されたキーと値を検出します。ディープオブジェクト比較、配列のDiff、ネストされたJSONデータの構造的変更の検出方法を学びます。
Code Diff
詳細な説明
JSON Diff比較
JSONファイルの比較には単純なテキストDiff以上のものが必要です — オブジェクトと配列の階層構造を理解する必要があります。優れたJSON Diffはセマンティックレベルで変更を特定します:追加されたキー、削除されたキー、変更された値、並べ替えられた要素。
テキストDiffと構造的Diffの違い
プレーンテキストDiffはJSONをテキスト行として扱います。これは、フォーマット変更(インデントの変更)やキーの並べ替えが、データが意味的に同一であっても大きな変更として表示されることを意味します。
// 元のバージョン
{ "name": "Alice", "age": 30 }
// 変更後(キーの並べ替えのみ)
{ "age": 30, "name": "Alice" }
テキストDiffはすべての行が変更されたと表示します。構造的Diffはオブジェクトが意味的に同等であるため、変更なしと表示します。
JSONの変更タイプ
| 変更タイプ | 例 |
|---|---|
| キー追加 | "email": "a@b.com"がオブジェクトに追加 |
| キー削除 | "phone"キーが削除 |
| 値変更 | "age": 30 → "age": 31 |
| 型変更 | "count": "5" → "count": 5 |
| ネストされた変更 | settings.themeが"dark"から"light"に変更 |
| 配列要素追加 | 配列に新しい項目を追加 |
| 配列要素削除 | 配列から項目を削除 |
ディープオブジェクト比較
ネストされたオブジェクトの場合、Diffは各変更への完全なJSONパスを表示すべきです:
変更: $.settings.theme: "dark" → "light"
追加: $.settings.notifications.email: true
削除: $.settings.legacy
配列のDiff戦略
配列はJSON Diffで最も難しい部分です:
- インデックスで: 各位置で要素ごとに比較
- IDで:
idやユニークフィールドで要素をマッチング - コンテンツで: 類似性を使用して最適なマッチング要素を見つける
大規模JSONの処理
1MBを超えるJSONファイルの場合:
- 変更のないセクションを折りたたむ
- 変更されたパスのみを表示
- 完全なDiffの前に変更数のサマリーを提供
ユースケース
JSON Diff比較は、予期せず変更されたAPIレスポンスのデバッグ、環境間(dev vs staging vs production)の設定ファイルの比較、プルリクエストでのpackage.jsonやtsconfig.jsonの変更レビュー、データ移行出力の期待結果との検証に不可欠です。