«Не так» делается вот что.
Структура data_xxx иерархическая, со многими уровнями вложенности. В то же время если посмотреть, что выдаёт data_xxx:
for data in data_old: print(data)
то увидим
company_id
resource
resource_id
status
data
то есть ключи только верхнего уровня. Соответственно, условие
if key in data_old and key in data_new and data_old[key] != data_new[key]:
проверяет различие только на верхнем уровне, не заглядывая внутрь контейнера, поэтому код и не находит различий (key in data_old всегда False).
Поставив диагноз, приступим к лечению. Нам надо не просто пройтись по всем ключам контейнера, но и заглянуть внутрь каждого значения, на случай, если значение само является контейнером.
Из-за обработки всякий ситуаций код получился немного громоздким.
def get_difference(container1, container2, diff_list):
def get_deep_difference(container1, container2, deepcheck):
nonlocal changes, diff_list
diff = False
try:
# Основной цикл по словарю
for key in container1.keys():
check = deepcheck or diff_list and key in diff_list
try:
if get_deep_difference(container1[key], container2[key], check):
if diff_list and key in diff_list: changes[key] = container2[key]
if deepcheck: return True
diff = True
except KeyError: # В container2 отсутствует key
if diff_list and key in diff_list: changes[key] = None
if deepcheck: return True
diff = True
except AttributeError: # container1 не словарь
if isinstance(container1, str): # строка особый тип, обрабатывается особо
return container1 != container2
try:
# Обработка других типов контейнеров (список, кортеж, множество)
for index, elem in enumerate(container1):
try:
if get_deep_difference(container1[index], container2[index], deepcheck):
if deepcheck: return True
diff = True
except IndexError: return True
except TypeError: return container1 != container2
return diff
# End of get_deep_difference
changes = dict()
get_deep_difference(container1, container2, False)
return changes
# End of get_difference
И использование:
result = get_difference(data_old, data_new, diff_list)
print(result)
Проверил на твоих данных, result получился таким:
{'services': [{'id': 22222225, 'title': 'Стрижка', 'cost': 1500, 'cost_per_unit': 1500, 'first_cost': 1500, 'amount': 1}], 'datetime': '2022-01-25T13:00:00+03:00'}
Найдите различия между двумя JSON-файлами.
Список параметров для отслеживания - diff_list = ["services", "staff", "datetime"]
Мой код: Мой код не находит различия
Прошу помощи, что делаю не так?
Данные, загруженные из json_old.json: Данные, загруженные из json_new.json: Различия в 'json_new.json'. Которые нужно найти.