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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:35:28