Python中JSON Schema验证字典构建问题及技术问询
JSON Schema验证器相关问题解答
主问题:validation_result返回None的原因
这其实是正常现象!Draft4Validator.check_schema()这个方法的设计逻辑就是如此:如果传入的Schema完全符合Draft4的语法规范,它就会返回None;只有当Schema存在语法错误时,它才会抛出对应的异常(比如SchemaError)。所以你得到None说明你的Schema在语法层面是合规的,完全不用慌~
三个技术问题的解答
1. 如何创建“值必须属于指定列表”的校验规则?
完全可以!JSON Schema里的enum关键字就是干这个的——你只需要把允许的所有值放进一个数组里,验证时待校验的JSON值如果不在这个数组里,就会直接验证失败。
比如你代码里的frequency字段已经用对了:
core["frequency"] = { "type": "string", "description": "Base frequency ", "enum": ["monthly", "daily", "weekly"] }
这段代码就要求frequency的值必须是"monthly"、"daily"、"weekly"中的一个,完美匹配你的需求。
2. 能否使用if条件校验规则?
可以用,但你代码里有两个关键问题需要修正:
- 路径错误:你的
mark字段是core对象下的属性,所以在写if条件时,上下文已经是core对象了,不需要再嵌套"core": {...},正确的条件应该直接校验同层级的frequency字段:"if": {"properties": {"frequency": {"enum": ["monthly"]}}} - Draft4不支持
if/then/else:你当前用的是Draft4Validator,但if/then/else是JSON Schema Draft7才引入的特性!如果想要使用条件校验,你需要切换到Draft7Validator(记得先导入),或者升级你的jsonschema库到支持Draft7的版本。
3. 如何按指定方式构建字典(降低出错概率)?
你写的代码有几个语法和逻辑错误,我给你修正并说明正确的姿势:
- 首先,
properties的值必须是字典(键值对),而不是集合(比如{"ref", "type", "value"}这种写法是错误的,应该给每个属性定义对应的Schema规则); - 其次,你先给
core["holidays"]["properties"]["default"]赋值,之后又直接给core["holidays"]赋值,这会把之前的内容完全覆盖,顺序搞反了。
正确的构建方式应该是先初始化holidays的基础结构,再逐个添加内部属性:
# 先初始化holidays的基础结构 core["holidays"] = { "type": "object", "description": "Holiday schedule", "properties": {} # 先留空,后面再填充 } # 逐个添加各个子属性的Schema core["holidays"]["properties"]["default"] = { "type": "object", "description": "", "properties": { "ref": {"type": "string"}, "type": {"type": "string"}, "value": {"type": "string"} } } core["holidays"]["properties"]["interim"] = { "type": "object", "description": "", "properties": {"interim": {"type": "string"}} } core["holidays"]["properties"]["selected"] = { "type": "object", "description": "", "properties": {"selection": {"$ref": "#/core/holidays/properties/default"}} } # 其余exante、expost同理 core["holidays"]["properties"]["exante"] = { "type": "object", "description": "", "properties": {"exante": {"$ref": "#/core/holidays/properties/default"}} } core["holidays"]["properties"]["expost"] = { "type": "object", "description": "", "properties": {"expost": {"$ref": "#/core/holidays/properties/default"}} }
这样既避免了覆盖问题,也保证了语法正确,能有效降低出错概率。
内容的提问来源于stack exchange,提问作者DGMS89
相关产品推荐
相关产品推荐

