リストの順序を無視して、2つのJSONオブジェクトがPythonで等しいかどうかをテストするにはどうすればよいですか?
例えば ...
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()
並べたリストであり、「トップ」レベル以外の何もソートしようとしないためです。反復可能。
これを修正するために、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
andに適用するとb
、結果は次のように比較されます。
>>> ordered(a) == ordered(b)
True
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加