JSONの追加フィールドを検出する
2つのJSONドキュメントを比較した際に、新しく追加されたフィールドを特定する方法を学びます。挿入検出、構造の拡張、diffツールによるハイライト表示について解説します。
詳細な説明
2つのJSONドキュメントを比較する際、最も一般的な差分の1つは、2番目のドキュメントに存在するが1番目のドキュメントには存在しないフィールドです。これらは追加フィールド(または挿入)と呼ばれ、データの構造的な拡張を表します。
追加検出の仕組み:
JSON diffアルゴリズムは、2つのオブジェクトを再帰的にキーごとに比較します。右側のドキュメントに存在するが左側のドキュメントに存在しない各キーについて、アルゴリズムは「追加」操作を記録します。追加されたキーへのフルパスが追跡されるため、階層内のどこに新しいデータが出現したかを正確に把握できます。
// 変更前
{
"name": "Alice",
"email": "alice@example.com"
}
// 変更後
{
"name": "Alice",
"email": "alice@example.com",
"phone": "+1-555-0100",
"address": {
"city": "Portland",
"state": "OR"
}
}
この例では、diffは2つの追加を報告します:スカラーフィールド phone とネストされたオブジェクト address(その子要素 city と state を含む)。優れたdiffツールは、単純な値の追加とサブツリー全体の追加を区別します。
主な考慮事項:
- ネストされた追加: 新しいオブジェクトや配列が丸ごと追加された場合、diffは親レベルでの単一の追加として、またはリーフノードごとの複数の追加として表示する場合があります。
- RFC 6902(JSON Patch): 標準のJSON Patch形式では、
"op": "add"操作で追加を表現し、ターゲットパスと挿入する値を指定します。 - スキーマの進化: 追加フィールドはAPI バージョニングにおいて一般的に後方互換性があります。未知のフィールドを無視するコンシューマーは引き続き動作するため、追加的な変更が削除やリネームより好まれます。
よくある落とし穴:
開発者は、フィールドの追加と、以前 null や空文字列だったフィールドを混同することがあります。diffツールはこれらを異なるものとして扱います:null から値に変わったフィールドは変更であり、追加ではありません。最初のドキュメントに完全に存在せず、2番目のドキュメントに存在するキーのみが追加としてカウントされます。
ユースケース
バックエンドデプロイ後のAPIレスポンスをレビューし、新しく追加されたフィールド(ユーザープロフィールの電話番号や住所など)が既存のコンシューマーを壊すことなく正しく表示されていることを確認する。