Pytest场景下如何高效对比两个JSON文件 适配Python3.5.2版本
方案实现
核心思路
你使用的Python3.5.2版本中,原生普通dict不会保留插入顺序,所以读取JSON时必须通过object_pairs_hook参数指定加载为OrderedDict,才能保留原JSON的键顺序,后续对比可根据是否需要校验顺序选择对应逻辑。
完整可运行代码
import os import json from collections import OrderedDict def compare_json_files(file_1, file_2, check_order=True): """ 对比两个JSON文件内容 :param file_1: 第一个JSON文件路径 :param file_2: 第二个JSON文件路径 :param check_order: 是否校验JSON键的原有顺序,默认开启 :return: 内容完全一致返回True,否则返回False """ # 校验文件存在性 if not os.path.isfile(file_1): raise FileNotFoundError("File not found: {}".format(file_1)) if not os.path.isfile(file_2): raise FileNotFoundError("File not found: {}".format(file_2)) # 按需求选择加载方式 load_hook = OrderedDict if check_order else None with open(file_1, 'r') as f1: data_1 = json.load(f1, object_pairs_hook=load_hook) with open(file_2, 'r') as f2: data_2 = json.load(f2, object_pairs_hook=load_hook) # 直接对比即可,OrderedDict的==运算天然会校验键的顺序 return data_1 == data_2
补充说明
- 你原代码里误用了
json.loads()处理文件对象,应该改用json.load()直接读取文件对象,或者先读取文件内容为字符串再传给json.loads() - 如果需要输出具体差异位置,可以递归遍历两个结构,逐个对比键值对并记录差异,嵌套结构里的字段缺失、值不同、顺序不符的位置都可以单独打印
- 如果JSON文件体积特别大(GB级别),可以逐行对比序列化后的字符串,但要注意两个JSON的缩进、换行符必须完全一致才适用,否则还是建议按结构化方式对比
内容的提问来源于stack exchange,提问作者Chel MS
相关产品推荐
相关产品推荐

