使用python对比两个json文件的不同并输出

import json

def compare_json(obj1, obj2, path=""):
    diff = []
    if isinstance(obj1, dict) and isinstance(obj2, dict):
        for key in obj1:
            if key not in obj2:
                diff.append([f"{path}.{key}", obj1[key], "", "yes"])
            else:
                sub_diff = compare_json(obj1[key], obj2[key], f"{path}.{key}")
                if len(sub_diff) > 0:
                    diff += sub_diff
                else:
                    diff.append([f"{path}.{key}", obj1[key], obj2[key], "no"])
        for key in obj2:
            if key not in obj1:
                diff.append([f"{path}.{key}", "", obj2[key], "yes"])
    elif isinstance(obj1, list) and isinstance(obj2, list):
        for i in range(min(len(obj1), len(obj2))):
            sub_diff = compare_json(obj1[i], obj2[i], f"{path}[{i}]")
            if len(sub_diff) > 0:
                diff += sub_diff
            else:
                diff.append([f"{path}[{i}]", obj1[i], obj2[i], "no"])
        if len(obj1) > len(obj2):
            for i in range(len(obj2), len(obj1)):
                diff.append([f"{path}[{i}]", obj1[i], "", "yes"])
        elif len(obj1) < len(obj2):
            for i in range(len(obj1), len(obj2)):
                diff.append([f"{path}[{i}]", "", obj2[i], "yes"])
    else:
        if obj1 != obj2:
            diff.append([path, obj1, obj2, "yes"])
        else:
            diff.append([path, obj1, obj2, "no"])
    return diff

def print_diff(diff_keys):
    print("-"*110)
    print("{:<60} {:<20} {:<20} {:<10}".format("key", "file1.json", "file2.json", "is_diff"))
    print("-"*110)

    for key, value1, value2, is_diff in diff_keys:
        print("{:<60} {:<20} {:<20} {:<10}".format(key, str(value1), str(value2), is_diff))

    print("----------------------------------------------------------------------------------------------------------")


def remove_long_keys(data, max_length, keys_to_remove=None):
    if keys_to_remove is None:
        keys_to_remove = []
    if isinstance(data, dict):
        for k, v in list(data.items()):
            if isinstance(v, str) and len(v) > max_length:
                del data[k]
            elif k in keys_to_remove:
                del data[k]
            else:
                remove_long_keys(v, max_length, keys_to_remove)
    elif isinstance(data, list):
        for item in data:
            remove_long_keys(item, max_length, keys_to_remove)


if __name__ == "__main__":
    with open('file1.json', 'r') as file1:
        json1 = json.load(file1)
        remove_long_keys(json1, 20, ['seeds'])

    with open('file2.json', 'r') as file2:
        json2 = json.load(file2)
        remove_long_keys(json2, 20, ['seeds'])


    diff_keys = compare_json(json1, json2)
    print_diff(diff_keys)

运行结果:
 

猜你喜欢

转载自blog.csdn.net/fvafuc/article/details/133773663