JSON Diffにおける空白の違いの処理

JSON diffツールが空白、インデント、フォーマットの違いをどのように処理するかを学びます。意味的比較がフォーマット変更による偽陽性を排除する理由を理解します。

Advanced Topics

詳細な説明

JSONの空白は2つのカテゴリに分類されます:重要でない空白(トークン間のフォーマット)と重要な空白(文字列値内のスペース)。適切なJSON diffツールは、偽陽性と偽陰性を避けるために、両方を正しく処理する必要があります。

重要でない空白(フォーマット):

JSONは可読性のためにトークン間に任意の空白を許可します。以下の3つの表現は意味的に同一です:

// 圧縮
{"name":"Alice","scores":[95,87,92]}

// 2スペースインデント
{
  "name": "Alice",
  "scores": [95, 87, 92]
}

// 4スペースインデント
{
    "name": "Alice",
    "scores": [
        95,
        87,
        92
    ]
}

意味的JSON diffは、データが同一であるため、これら3つのドキュメント間で差分ゼロを報告します。テキストベースのdiffでは、すべての行が変更として報告されます。

重要な空白(文字列値内):

文字列値内の空白はデータの一部であり、保持する必要があります:

// 変更前
{ "message": "Hello World" }

// 変更後
{ "message": "Hello  World" }

JSON diffは、これを値の変更として正しく報告します:"Hello"と"World"の間の単一スペースが二重スペースになりました。

空白のみの差分が発生する一般的なシナリオ:

  1. 異なるフォーマッター: ある開発者は2スペースインデントのPrettierを使用し、別の開発者は4スペースを使用。データは同じです。
  2. 異なるソースからのコピー&ペースト: ターミナルとWebページからJSONを貼り付けると、異なる改行コード(\n vs \r\n)が導入される場合があります。
  3. 圧縮/整形: 圧縮ファイルにJSONフォーマッターを実行すると、すべての行が変更されますがデータは変わりません。

ベストプラクティス:

  • フォーマット変更によるノイズを避けるため、テキストdiffではなく必ずパース/意味的JSON diffを使用してください。
  • 共有のリンターまたはフォーマッター設定を使用して、チームのJSONフォーマット(インデントスタイル、改行コード)を標準化してください。
  • バージョン管理にJSONを保存する際は、git diffをクリーンに保つために一貫したフォーマットを使用してください。

ユースケース

自動ツールが大きなJSON設定ファイルを再フォーマットしたプルリクエストからフォーマットのノイズをフィルタリングし、ファイル内の実際のデータ変更にのみ注目する。

試してみる — JSON Diff

フルツールを開く