如何批量校验JSON文件并定位具体错误生成清晰校验报告
结论
仅使用jsonschema完全可以实现精准错误定位、自定义明确报错的需求,你之前只拿到通用无效提示,本质是没有利用校验过程中抛出的异常对象携带的详细信息。
原生jsonschema实现方案
jsonschema校验失败时抛出的ValidationError对象,已经自带所有错误定位需要的核心属性:
path:错误字段的路径元组,支持嵌套结构定位,比如你示例中的错误会返回('data_type',)instance:触发错误的具体字段值,比如示例中会返回"null"validator:命中的校验规则类型,示例中命中的是not规则message:默认生成的错误描述
你可以基于这些属性,自定义错误提示的拼接逻辑,不需要额外依赖。
基础实现代码
import json import os from jsonschema import validate, ValidationError # 加载预定义的校验schema with open("schema.json", "r", encoding="utf-8") as f: check_schema = json.load(f) def single_file_check(file_path: str) -> str: # 先校验JSON本身格式是否合法 try: with open(file_path, "r", encoding="utf-8") as f: json_data = json.load(f) except json.JSONDecodeError as e: return f"❌ {file_path} 无效:JSON格式错误,{str(e)}" # 按schema校验内容 try: validate(instance=json_data, schema=check_schema) return f"✅ {file_path} 有效:校验通过" except ValidationError as e: # 拼接字段路径,嵌套字段会自动生成a.b.c格式的路径 field_path = ".".join(map(str, e.path)) if e.path else "根节点" # 针对你配置的not+enum禁止值场景定制提示 if e.validator == "not" and "enum" in e.schema: return f"❌ {file_path} 无效:您在{field_path}字段中添加了禁止值{e.instance}" # 其他类型错误通用提示 return f"❌ {file_path} 无效:{field_path}字段配置错误,{e.message}" # 批量遍历文件夹校验 def batch_check(folder_path: str) -> list: result_list = [] for root, _, files in os.walk(folder_path): for file in files: if file.endswith(".json"): file_full_path = os.path.join(root, file) result_list.append(single_file_check(file_full_path)) return result_list if __name__ == "__main__": # 替换成你的目标JSON文件夹路径 check_results = batch_check("./target_json_folder") # 控制台输出时可以给错误内容加红色高亮,不需要高亮可以去掉ANSI转义符 for res in check_results: if res.startswith("❌"): print(f"\033[31m{res}\033[0m") else: print(f"\033[32m{res}\033[0m") # 结果也可以直接写入文件生成正式校验报告 with open("校验报告.txt", "w", encoding="utf-8") as f: f.write("\n".join(check_results))
更灵活的自定义提示方案
如果不想在代码里写大量规则判断,可以在schema.json里给每个规则加errorMessage字段写自定义提示,再通过jsonschema的扩展能力让校验时直接读取你写好的提示,比如你示例中的规则可以修改为:
"data_type": { "type": "string", "not": { "enum": ["null", "0", "NULL", ""] }, "errorMessage": { "not": "该字段不允许填写null、0、NULL或空字符串", "type": "该字段必须为字符串类型" } }
扩展校验器后,不需要在业务代码里写分支判断,就能直接返回你在schema里预设的提示文本。
非jsonschema可选方案
如果你的JSON结构长期固定,也可以选择pydantic实现校验:
- 提前定义和JSON结构匹配的数据模型,通过
Field配置、字段校验器编写规则,每个规则可以直接绑定自定义错误提示 - 加载JSON后调用模型的校验方法,捕获校验异常后可以直接拿到字段路径、错误值、预设提示,代码写法更简洁
- 缺点是JSON结构变动时需要同步修改模型代码,灵活度不如直接改schema.json。
内容的提问来源于stack exchange,提问作者Montek
相关产品推荐
相关产品推荐

