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)
运行结果: