同じ要素を持つ 2 つの JSON オブジェクトを異なる順序で比較するにはどうすればよいでしょうか? 質問する

同じ要素を持つ 2 つの JSON オブジェクトを異なる順序で比較するにはどうすればよいでしょうか? 質問する

リストの順序を無視して、Python で 2 つの JSON オブジェクトが等しいかどうかをテストするにはどうすればよいですか?

例えば ​​...

JSONドキュメント1つの:

{
    "errors": [
        {"error": "invalid", "field": "email"},
        {"error": "required", "field": "name"}
    ],
    "success": false
}

JSONドキュメントb:

{
    "success": false,
    "errors": [
        {"error": "required", "field": "name"},
        {"error": "invalid", "field": "email"}
    ]
}

abリストの順序が異なっていても、比較すると等しいはずです"errors"

ベストアンサー1

同じ要素を持ちながら順序が異なる 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この関数をとに適用するとb、結果は等しくなります。

>>> ordered(a) == ordered(b)
True

おすすめ記事