[解決済み] 異なる順序で同じ要素を持つ2つのJSONオブジェクトを等しく比較するには?
2022-07-09 17:17:57
質問
Pythonで2つのJSONオブジェクトが等しいかどうか、リストの順番を無視してテストするにはどうすればよいですか?
例えば...
JSONドキュメント a :
{
"errors": [
{"error": "invalid", "field": "email"},
{"error": "required", "field": "name"}
],
"success": false
}
JSONドキュメント b :
{
"success": false,
"errors": [
{"error": "required", "field": "name"},
{"error": "invalid", "field": "email"}
]
}
a
そして
b
の順序が同じであっても、比較する必要があります。
"errors"
のリストの順序が異なっていても、等しく比較されます。
どのように解決するのですか?
同じ要素を持つが順序が異なる 2 つのオブジェクトを等しく比較したい場合、明らかに行うべきことは、ソートされたコピーを比較することです。たとえば、JSON 文字列で表される辞書の場合
a
と
b
:
import json
a = json.loads("""
{
"errors": [
{"error": "invalid", "field": "email"},
{"error": "required", "field": "name"}
],
"success": false
}
""")
b = json.loads("""
{
"success": false,
"errors": [
{"error": "required", "field": "name"},
{"error": "invalid", "field": "email"}
]
}
""")
>>> sorted(a.items()) == sorted(b.items())
False
... でもうまくいきません。なぜなら、それぞれのケースで
"errors"
の項目は同じ要素を異なる順番で並べたリストだからです。
sorted()
は反復可能の "top" のレベル以外では何もソートしようとしません。
それを修正するために
ordered
関数を定義することができます。この関数は、見つけたリストを再帰的にソートします(そして、辞書を
(key, value)
のペアのリストに変換し、順序付けできるようにします)。
def ordered(obj):
if isinstance(obj, dict):
return sorted((k, ordered(v)) for k, v in obj.items())
if isinstance(obj, list):
return sorted(ordered(x) for x in obj)
else:
return obj
この関数を
a
と
b
の場合、結果は同じように比較されます。
>>> ordered(a) == ordered(b)
True
関連
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] リストの要素数を取得する方法
-
[解決済み] オブジェクトの属性に基づいてオブジェクトのリストを並べ替えるには?
-
[解決済み] Python RequestsでJSONデータをPOSTする方法とは?
-
[解決済み] ヒストグラム Matplotlib
-
[解決済み] リストスライスの割り当てはどのように行われるのですか?
-
[解決済み] Seleniumから要素の属性を取得するには?
-
[解決済み] pandasのデータフレームでカスタムソートする
-
[解決済み] Pythonのモジュール命名規則
-
[解決済み] Python のモック patch.object を使って、他のメソッド内で呼び出されたメソッドの戻り値を変更する。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】JSONのリストで要素の順番は守られますか?
-
[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複
-
[解決済み] Matplotlibのレジェンドが動作しない
-
[解決済み] python BeautifulSoup テーブルのパース
-
[解決済み] Django の Forms のテストはどのように書くべきですか?
-
[解決済み] Python 2 で HEAD HTTP リクエストを送信するには?
-
[解決済み] 2つの日付の間の月数を求める最良の方法
-
[解決済み] pandas DataFrameへのメタ情報/メタデータの追加
-
[解決済み] Python のモック patch.object を使って、他のメソッド内で呼び出されたメソッドの戻り値を変更する。
-
[解決済み] 2ウェイ/リバースマップ[重複]について