短い答え
- JSONフォーマッターを開き、1つ目のファイルを貼り付け、インデントをスペース2つにして、すべてのオブジェクトのキーを並べ替えるにチェックを入れます。結果をコピーします。
- テキスト差分を開き、左側の枠に貼り付けます。
- 2つ目のファイルにも同じことをして、右側の枠へ。
いま光るものは本物です。変わった値、現れたキー、消えた項目。ふつうの差分を溺れさせたはずの整形の違いと並び替わったキーは消えています。比較が始まる前に、両側が同じつづりで書かれていたからです。
どちらのページにもネットワーク機能はいっさいありません。知っておく値打ちがあります。人が比較するJSONは、あまりにも多くの場合、資格情報がまだ中に残った設定ファイルだからです。
生のJSON差分がほとんどノイズである理由
JSONは空白を気にせず、キーの順序に意味を与えません。同じ文書が1行にも400行にもなり、キーは打った順にも、どこかのライブラリが吐いた順にもなります。そして道具はどちらも勝手に書き換えます。片側はミニファイ、片側は展開。片側は手で保存、もう片側はアルファベット順に並べるシリアライザーで。行の差分には、赤の他人の2ファイルに見えます。
最悪の2つの場合が要点を示します。ミニファイされたファイルは1行なので、それに対する差分は巨大な変更行が1つ。正しくて、役に立ちません。そして同じ内容が別の順序の2ファイルは全部変更として比較されますが、正直な答えは「何も」のはずです。
フォーマッターの正規形が直すもの
両方のファイルを同じ設定の同じフォーマッターに通すことこそ、差分に必要なものです。文書ごとに、つづりは1つ。
- 同じインデントが各キーを自分の行に置きます。差分は行単位で働けるようになり、その単語マークは、行の中で変わったただ1つの値を指せます。
- 並べ替えたキーが両側を同じ順序に置き、順序は違いであることをやめます。並びはコードポイントではなくキーの読まれ方に従い—
item2がitem10より前——両側に同一に適用されます。 - ほかには何も動きません。このフォーマッターは数を打ったとおりの桁のまま保ち、重複キーも裁かずに保ちます。正規化それ自体が違いをでっち上げることはできないということです。フォーマッターのガイドが、それが本来あるべきより珍しい理由を説明しています。
正直な但し書きをひとつ。並べ替えた出力は、キーの動いた文書です。下流の道具がキーの順序を気にするなら——少数ですが存在します——並べ替えた写しは比較される対象として扱い、原本の置き換えにはしないでください。
結果を読む、そして持ち帰る
差分は消えた行を左に、増えた行を右に印し、変わった行の中では異なる単語を強調します。正規形の上なら、それはたいていfalseからtrueへ動いたただ1つの値です。変わらなかった真ん中は数に畳まれ、2000行の設定に3か所の手直しなら、短い3つの節として読めます。
ダウンロードは統合形式のパッチ、.patchです。コードレビューの理解するフォーマットで、正規形を記述します。それはたいてい、レビューがどのみち欲しいものです。再整形ぬきの、変更だけ。
同じ手順は、2つのページが話せるほかのすべてにも効きます。YAMLもXMLも同じやり方で正規形になりますし、出どころの違う同じ形の2ファイルには、差分の無視スイッチ——空白、大文字小文字、空行——が同じ発想の軽い版です。
これを毎週やるなら
2回整形して、2回貼り付ける。手順が2つのページに住んでいるのは、各ページが1つの仕事をし、それぞれが単独で、貼り付けたものが何ひとつどこへも行かなかったことを証明できるからです。しかし両方ともオープンソースです。MITライセンス、依存なしのESモジュール——フォーマッターのパーサーはキーの順序と桁を守り、差分はMyersのアルゴリズム——それぞれに、説明するREADMEが付いています。
これが日々の一部なら、コーディングエージェントをリポジトリに向けて、比較しながら正規形にする2枠のページを頼んでください。parseJsonとprintJsonとcompareTextは、importの3行先です。モジュールは読まれるために書かれていて、持ち出すことこそライセンスの目的です。