使用Python对比两个JSON文件的键并仅返回键值差异
对比两个JSON文件键值差异的Python实现
嘿,我来帮你搞定这个JSON对比的需求!这里有个实用的Python脚本,能递归遍历JSON的嵌套结构,精准找出两个文件里键值存在差异的部分——不管是键缺失,还是同键不同值,都能给你理得明明白白。
完整代码实现
import json def compare_json(obj1, obj2, path=""): differences = {} # 获取两个JSON对象的所有唯一键 all_keys = set(obj1.keys()).union(set(obj2.keys())) for key in all_keys: current_path = f"{path}.{key}" if path else key # 处理第一个JSON有、第二个没有的键 if key not in obj2: differences[current_path] = { "type": "missing in second JSON", "value": obj1[key] } # 处理第二个JSON有、第一个没有的键 elif key not in obj1: differences[current_path] = { "type": "missing in first JSON", "value": obj2[key] } # 处理双方都有但值不同的情况 else: val1 = obj1[key] val2 = obj2[key] # 如果都是嵌套字典,递归深入对比 if isinstance(val1, dict) and isinstance(val2, dict): nested_diff = compare_json(val1, val2, current_path) if nested_diff: differences.update(nested_diff) # 非字典类型的值不相等时,记录差异 elif val1 != val2: differences[current_path] = { "first JSON value": val1, "second JSON value": val2 } return differences def main(): # 替换成你实际的两个JSON文件路径 json_file1 = "file1.json" json_file2 = "file2.json" try: # 读取并解析JSON文件 with open(json_file1, 'r', encoding='utf-8') as f1: data1 = json.load(f1) with open(json_file2, 'r', encoding='utf-8') as f2: data2 = json.load(f2) # 执行对比并获取差异结果 diffs = compare_json(data1, data2) if diffs: print("找到以下键值差异:") print(json.dumps(diffs, indent=2, ensure_ascii=False)) else: print("两个JSON文件的键值完全一致!") except FileNotFoundError as e: print(f"出错啦:找不到文件 {e.filename}") except json.JSONDecodeError as e: print(f"出错啦:JSON解析失败,文件格式有问题 - {e}") if __name__ == "__main__": main()
代码说明
- 递归对比逻辑:
compare_json函数会遍历两个JSON对象的所有键,处理三种差异场景:一方缺失键、同键不同值,遇到嵌套字典时会自动递归深入对比内部结构,完美适配你提供的多层嵌套JSON格式。 - 异常处理:脚本加入了文件找不到和JSON格式错误的捕获,避免运行时崩溃,还会给出清晰的错误提示。
- 结果输出:差异结果会以结构化的JSON格式打印,键路径清晰(比如
test.bucket.name),方便你快速定位问题。
使用方法
- 把你的两个JSON文件分别命名为
file1.json和file2.json(或者修改代码里的文件路径),放在脚本同一目录下。 - 运行脚本,就能看到所有键值差异啦!
内容的提问来源于stack exchange,提问作者Sabarish Manikandan
相关产品推荐
相关产品推荐

