You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:36:03