如何验证含本地/外部文件$ref的JSON Schema及字典校验
使用带本地/外部引用的JSON Schema校验字典
要处理包含本地定义引用和外部文件引用的JSON Schema校验,我们可以用Python的jsonschema库,通过RefResolver来解析这些引用路径。下面是具体实现步骤和代码:
前提准备
确保你已安装jsonschema库:
pip install jsonschema
假设文件结构如下:
./ ├── main_schema.json # 你的主Schema文件 ├── Common.json # 外部引用的Schema文件 └── validate.py # 校验脚本
校验代码实现
在validate.py中写入以下代码:
import json from jsonschema import validate, RefResolver from pathlib import Path def load_schema(schema_path): """加载本地JSON Schema文件""" with open(schema_path, 'r', encoding='utf-8') as f: return json.load(f) # 加载主Schema和外部Schema main_schema = load_schema('main_schema.json') common_schema = load_schema('Common.json') # 创建RefResolver,指定主Schema的基准URI,同时注册外部Schema的URI base_uri = Path('main_schema.json').absolute().as_uri() resolver = RefResolver( base_uri=base_uri, referrer=main_schema, store={ # 注册外部Schema的URI到store中,让Resolver能找到它 Path('Common.json').absolute().as_uri(): common_schema } ) def validate_dict(data): """用Schema校验字典数据""" try: validate(instance=data, schema=main_schema, resolver=resolver) return True, "数据校验通过" except Exception as e: return False, str(e) # 测试示例 if __name__ == '__main__': # 测试通过的案例 valid_data = { "ReferenceToLocalSchema": {"no-write": True}, "ReferenceToExternalSchema": {"src": ["file1.txt", "file2.jpg"]} } print(validate_dict(valid_data)) # 输出: (True, '数据校验通过') # 测试不通过的案例(缺少ExternalType的必填src字段) invalid_data = { "ReferenceToLocalSchema": {"no-write": False}, "ReferenceToExternalSchema": {} } print(validate_dict(invalid_data)) # 输出校验错误信息
代码说明
load_schema函数负责读取本地JSON Schema文件并解析为字典。RefResolver的作用是解析Schema中的$ref引用:base_uri指定主Schema文件的绝对URI,作为解析本地引用的基准。store参数注册外部Schema的URI和对应的Schema内容,让Resolver能找到外部文件中的定义。
validate函数结合Resolver完成数据校验,捕获异常返回校验结果。
内容的提问来源于stack exchange,提问作者Nore Hamou tahra
相关产品推荐
相关产品推荐

