Сравните два разных JSON In Python Используя Difflib, показывая только различия - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь сравнить 2 разных фрагмента (Javascript / JSON) кода с использованием модуля difflib в Python 3.8,

{"message": "Hello world", "имя": "Джек"}

и

{"message": "Hello world", "name": "Ryan"}

Проблема: Когда эти 2 строки предварительно проверяются и сравниваются с использованием difflib, мы получаем внутренние различия, а также все общие линии.

Есть ли способ показывать только линии, которые отличаются, чтобы было понятнее? Это значительно поможет, когда оба файла имеют гораздо больший размер, что затрудняет идентификацию измененных строк.

Спасибо!


Фактический вывод

{
    "message": "Hello world",
    "name": "{J -> Ry}a{ck -> n}"
}

Желаемый вывод

    "name": "{J -> Ry}a{ck -> n}"

Еще лучше будет что-то вроде:

    {"name": "Jack"} -> {"name": "Ryan"}

Python Используемый код

Мы используем jsbeautifier здесь вместо json, потому что файлы, которые мы сравниваем, могут иногда быть искажены JSON. json выдаст ошибку, в то время как jsbeautifier все еще форматирует ее так, как мы ожидаем.

1 Ответ

0 голосов
/ 02 марта 2020

Для вашего желаемого выхода вы можете обойтись даже без использования difflib, например:

def find_diff(a, b):
    result = []
    a = json.loads(a)
    b = json.loads(b)
    for key in a:
        if key not in b:
            result.append(f'{dict({key: a[key]})} -> {"key deleted"}')
        elif key in b and a[key] != b[key]:
            result.append(f'{dict({key: a[key]})} -> {dict({key: b[key]})}')
    return '\n'.join(t for t in result)

# File content to compare
file1 = '{"new_message": "Hello world", "name": "Jack"}'
file2 = '{"message": "Hello world", "name": "Ryan"}'

print(find_diff(f1, f2))

#{'new_message': 'Hello world'} -> key deleted
#{'name': 'Jack'} -> {'name': 'Ryan'}

Существует множество способов справиться с этим, попробуйте адаптировать его для ваши потребности.

...