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

如何批量校验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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:06:27