きり丸の技術日記

技術検証したり、資格等をここに残していきます。

PythonでJSONを一部項目を無視して比較したい(I want to compare JSON in Python while ignoring certain items by deepdiff)

PythonでJSONを比較したいという記事を過去に書きました。しかし、日付項目等々の固定しづらい項目を無視して比較するというユースケースが達成できていませんでした。

今回の記事では、一部項目を無視して比較する方法を記載します。

前提

  • Python
    • 3.11
  • DeepDiff
    • 6.3.0

対応

DeepDiffを使用します。

導入

DeepDiffをインストールしてください。

pip install deepdiff
pipenv install deepdiff

比較

DeepDiffを使うには、DeepDiffのインスタンスを元に比較します。過去の記事と同様に、json.loadsメソッドを使ってJSONをDict型に変換します。

今回の場合は日付項目のcreatetime, updatetimeを無視するようにするため、DeepDiffのインスタンス作成時にexclude_pathsを渡します。

import json

from deepdiff import DeepDiff

def test_if_ignore_column_has_diff_then_True():
    # GIVEN
    json_data_1 = """
{
"name": "John",
"createtime": "2222-01-01T00:11:00Z",
"updatetime": "2222-04-10T15:30:00Z"
}
"""

    json_data_2 = """
{
"name": "John",
"createtime": "3333-01-01T00:11:00Z",
"updatetime": "3333-04-11T08:00:00Z"
}
"""
    dict_1 = json.loads(json_data_1)
    dict_2 = json.loads(json_data_2)

    # WHEN
    actual = DeepDiff(dict_1, dict_2, exclude_paths=["createtime", "updatetime"])

    # THEN
    assert actual == {}

ソースコード

終わりに

なかなかJSONの特定の項目を無視する方法が見つかりませんでした。

DeepDiff自体にはオプションが大量にあったため、細かい比較をする際にも役立ちそうです。2023年4月19日時点で、1.6KのStarもあることからPythonでのJSON比較のスタンダードなのかもしれません。

参考情報

類似情報