[解決済み] JSONファイルを比較するためにjqまたは他のコマンドラインツールを使用すること
2022-03-11 10:08:44
質問
2つのJSONファイルが、辞書のキーとリスト要素の順序に影響を受けずに同一であるかどうかを確認するために使用できるコマンドライン・ユーティリティはありますか?
を使用して行うことができます。
jq
または同等のツールはありますか?
例
これら2つのJSONファイルは同一です
A
:
{
"People": ["John", "Bryan"],
"City": "Boston",
"State": "MA"
}
B
:
{
"People": ["Bryan", "John"],
"State": "MA",
"City": "Boston"
}
が、この2つのJSONファイルは異なるものです。
A
:
{
"People": ["John", "Bryan", "Carla"],
"City": "Boston",
"State": "MA"
}
C
:
{
"People": ["Bryan", "John"],
"State": "MA",
"City": "Boston"
}
ということになる。
$ some_diff_command A.json B.json
$ some_diff_command A.json C.json
The files are not structurally identical
解決方法は?
jqの比較はすでにキーの順序を考慮せずにオブジェクトを比較しているので、あとは比較する前にオブジェクト内のすべてのリストをソートすればよいのです。2つのファイルの名前が
a.json
と
b.json
は、最新のjq nightlyで。
jq --argfile a a.json --argfile b b.json -n '($a | (.. | arrays) |= sort) as $a | ($b | (.. | arrays) |= sort) as $b | $a == $b'
このプログラムは、要求された等式の定義を使って、オブジェクトが等しいかどうかによって、"true" または "false" を返す必要があります。
編集
(.. | arrays) |= sort
の構成は、実際にはいくつかのエッジケースで期待通りに動作しません。
このGitHubの課題
は、その理由を説明し、いくつかの代替案を提供しています。
def post_recurse(f): def r: (f | select(. != null) | r), .; r; def post_recurse: post_recurse(.[]?); (post_recurse | arrays) |= sort
上記のjqの呼び出しに適用される。
jq --argfile a a.json --argfile b b.json -n 'def post_recurse(f): def r: (f | select(. != null) | r), .; r; def post_recurse: post_recurse(.[]?); ($a | (post_recurse | arrays) |= sort) as $a | ($b | (post_recurse | arrays) |= sort) as $b | $a == $b'
関連
-
[解決済み] コマンドラインを使用してJSONオブジェクトの項目をカウントする方法は?
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] Chromeを使用してASP.NET Web APIがXMLの代わりにJSONを返すようにするにはどうすればよいですか?
-
[解決済み] UnixツールでJSONをパースする
-
[解決済み] コマンドラインからdiffをカラー化する方法
-
[解決済み] Visual Studioで2つのファイルを比較する
-
[解決済み】GoでPOSTリクエストでJSON文字列を送信する方法
-
[解決済み】JSONの構文では、オブジェクト内のキーの重複は許されるのか?
-
[解決済み】文字列のJSON配列はどのように表現するのですか?
-
[解決済み】HTTPの "406-Not Acceptable Response "とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Sequelizeとnode.jsを使った一括挿入の方法
-
[解決済み] JSONとJSONPの違いは何ですか?
-
[解決済み] tsconfig.jsonは何のためにあるのですか?
-
[解決済み] JSONの未定義の値型
-
[解決済み] JSON文字列をjqを使用してテーブルとしてフォーマットする方法は?
-
[解決済み】GoでJSONのPost Requestを処理する
-
[解決済み】Goを使ってJSONをpretty-printするにはどうすればいいですか?
-
[解決済み】mongodbでISODateを使った日付クエリが動作しないようです。
-
[解決済み】application/jsonとapplication/x-www-form-urlencodedの違いは何ですか?
-
[解決済み] gitを使用してレポにない2つのファイルを比較する方法