HOWTO · Python

JSON Diff を使用した Python のマルチレベル JSON オブジェクトの比較

この記事は、2つのマルチレベル JSON オブジェクトを比較して、それらが同じかどうかを判断する方法を示すことを目的としています。

このページの内容

この記事の目的は、2つのマルチレベル JSON オブジェクトを比較して、それらが同一かどうかを判断する方法を示すことです。

Python でのマルチレベル JSON オブジェクトの比較

JavaScript Object Notation の略で、JSON オブジェクトは主にデータ交換に使用され、一般的に非常に軽量であると考えられています。 その主な利点の 1つは、人間と機械が簡単に理解できることです。つまり、簡単に解析できるため、デバイスは貴重な情報を抽出できます。

頻繁に使用されるため、何らかの理由で 2つのオブジェクトを比較する必要がある場合があります。 内容が同一かどうかを確認するため、または別の目的で使用できます。

次のコードを検討してください。

obj1 = {
    "countries": [
        {
            "name": "Great Britian",
            "cities": [{"name": "Manchester"}, {"name": "London"}],
        }
    ]
}

obj2 = {"countries": [{"name": "Great Britian", "cities": [{"name": "London"}]}]}

コード スニペットは、国とその都市に関する情報を格納する 2つの JSON オブジェクトがあることを示しています。 ここで注目すべき興味深い点は、それらがマルチレベルであることです。つまり、オブジェクトにはネストされたより多くの JSON オブジェクトが含まれています。

Python で等値演算子を使用してマルチレベル JSON オブジェクトを比較する

サードパーティのライブラリを詳しく調べる前に、標準の Python 関数を使用してタスクを実行できるかどうかを確認することをお勧めします。 私たちにとって幸いなことに、平等は私たちのユースケースでも同様に機能します。

ただし、データのフィルタリングや特定の変更の検索など、変数をより詳細に制御する必要がある場合は、サードパーティのライブラリを使用する必要がある場合があります。これは、等価演算子は必要なほどの柔軟性を提供しないためです。 より単純なケースでは、等値演算子を使用するだけで十分です。

次のコードを検討してください。

obj1 = {
    "errors": [{"error": "err1", "fld": "mail"}, {"error": "err2", "fld": "name"}],
    "success": "false",
}

obj2 = {
    "errors": [{"error": "err1", "fld": "mail"}, {"error": "err2", "fld": "name"}],
    "success": "false",
}

obj3 = {
    "errors": [
        {"error": "err1", "fld": "mail"},
        {"error": "err2", "fld": "name"},
        {"error": "err3", "fld": "time"},
    ],
    "success": "false",
}

print(obj1 == obj2)
print(obj2 == obj3)

出力:

True
False

以下では、3つの JSON オブジェクトが宣言されていることがわかります。そのうちの 2つは同じで、1つは異なっています。 等値演算子を使用して、それらが同じかどうかを判断できます。

このアプローチは、サードパーティのライブラリよりも実装しやすく、ライブラリのドキュメントを確認する手間が省けます。 一方、必要に応じてサードパーティのモジュール/ライブラリを使用して実現できる機能はあまり提供されません。

jsondiff を使用して Python でマルチレベルの JSON オブジェクトを比較する

jsondiffは、JSON と JSON のような構造を区別するために使用できるサードパーティのオープンソース モジュールです。 このライブラリを使用すると、マルチレベルまたは順序付けされていない JSON オブジェクト間の違いを簡単に見つけることができます。

その方法を確認する前に、最初に jsondiff をインストールしましょう。これはサードパーティのモジュールであり、標準の Python インストールには組み込まれていないためです。

jsondiff のインストールガイド

コマンド プロンプトを開き、次のコマンドを実行して jsondiff のインストールを開始します。

pip install jsondiff

出力:

Collecting jsondiff
Downloading jsondiff-2.0.0-py3-none-any.whl (6.6 kB)
Installing collected packages: jsondiff
Successfully installed jsondiff-2.0.0

jsondiff がインストールされたら、それを使用してタスクを実行できます。

次のコードを検討してください。

import jsondiff

obj1 = {
    "countries": [
        {
            "name": "Great Britian",
            "cities": [{"name": "Manchester"}, {"name": "London"}],
        }
    ]
}

obj2 = {
    "countries": [
        {
            "name": "Great Britian",
            "cities": [{"name": "Manchester"}, {"name": "London"}],
        }
    ]
}

res = jsondiff.diff(obj1, obj2)

if res:
    print("Diff found")
else:
    print("Same")

出力:

Same

次のコードでは、サードパーティ ライブラリ jsondiff を使用して、2つのオブジェクトが同じかどうかを調べています。 より具体的には、関数 jsondiff.diff() を使用して、obj1 および obj2 という名前の JSON オブジェクトを渡します。

jsondiff.diff がどのように機能するかというと、変更が見つかった場合はそれらを返し、res という名前の変数に保存します。 違いがあるかどうかにかかわらず、比較したオブジェクトが同一か異なるかをすぐに判断できます。