jsonschema.validate() 默认使用 draft 4;不指定 $schema 时始终按 draft4validator 行为解析,即使 schema 中声明了 "$schema": "https://json-schema.org/draft/2020-12/schema#",也需显式使用 draft202012validator 类才能启用 unevaluatedproperties 等新特性。

jsonschema.validate() 默认用哪个 draft?
不指定 $schema 时,jsonschema.validate() 实际按 Draft4Validator 行为解析,哪怕你装的是最新版 jsonschema(如 4.21+)。这不是 bug,是向后兼容的默认策略——它不会自动升级到 Draft 2020-12,哪怕你本地 schema 里写了 "$schema": "https://json-schema.org/draft/2020-12/schema"。
常见错误现象:ValidationError 提示里出现 "unevaluatedProperties" 或 "dependentSchemas" 不被识别,但 schema 明明写了对应 draft 地址。原因就是 validator 实例没按你写的 $schema 自动切换版本。
- 必须显式传入对应 Validator 类,不能只靠
$schema字段 -
Draft7Validator支持const、if/then/else,但不支持unevaluatedProperties -
Draft202012Validator才真正支持unevaluatedProperties和dependentSchemas
怎么指定 Draft 2020-12 验证器?
得绕过 validate() 的默认行为,手动构造 Validator 实例。核心是两步:加载 schema(含 $schema),再用匹配的类验证数据。
使用场景:你用 VS Code + JSON Schema 插件写了带 unevaluatedProperties: true 的 schema,结果 Python 里跑不通,就是卡在这儿。
立即学习“Python免费学习笔记(深入)”;
睿拓智能网站系统-网上商城1.0免费版软件大小:5M运行环境:asp+access本版本是永州睿拓信息专为电子商务入门级用户开发的网上电子商城系统,拥有产品发布,新闻发布,在线下单等全部功能,并且正式商用用户可在线提供多个模板更换,可实现一般网店交易所有功能,是中小企业和个人开展个人独立电子商务商城最佳的选择,以下为详细功能介绍:1.最新产品-提供最新产品发布管理修改,和最新产品订单查看2.推荐产
- 先 import 对应类:
from jsonschema.validators import Draft202012Validator - 用
Draft202012Validator.check_schema(schema)确保 schema 本身合法 - 创建实例:
validator = Draft202012Validator(schema),再调validator.validate(instance) - 别用
jsonschema.validate(instance, schema)—— 它无视你 schema 里的$schema
为什么不用 RefResolver 自动选 draft?
jsonschema 库内部确实有 RefResolver,但它只管 $ref 解析路径,不管 $schema 版本路由。版本选择在 Validator 初始化时就锁死了,Resolver 不参与这个决策。
性能影响:不同 draft 的 validator 构造开销差异不大,但 Draft 2020-12 的验证逻辑更复杂,对 deeply nested 或大量 unevaluatedProperties 的数据,错误提示会更准,但耗时略高。
- 没有“自动适配”机制;写错 validator 类,
$ref还能正常工作,但关键字校验直接失效 - Draft 2020-12 要求所有 schema 必须显式声明
$schema,否则check_schema()会报错 - 兼容性注意:旧版 Python(jsonschema>=4.18
容易忽略的 schema 写法坑
就算 validator 选对了,schema 本身写法不对,一样白搭。最常踩的是 $schema 值拼错或协议头不全。
错误示例:"$schema": "draft-2020-12"(缺 URL)、"$schema": "https://json-schema.org/draft/2020-12/schema"(少末尾 #)。
- 正确值必须是完整 URI,且以
#结尾:"$schema": "https://json-schema.org/draft/2020-12/schema#" - Draft 2020-12 下,
type: "null"必须写成type: ["null"],单字符串会被忽略 - 如果 schema 里混用
additionalProperties和unevaluatedProperties,后者优先级更高,前者会被静默忽略
$schema 的 URI 必须严格对应,差一个字符都会退化成 Draft 4 行为,而且不报错——这是最麻烦的地方。









