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

如何用Python jsonschema的if/then/else精准定位验证错误并避免嵌套?

问题背景

我是python-jsonschema的重度用户,最近发现了if/then/else特性,用起来很顺手,但遇到了一个棘手的问题:

初始Schema与验证问题

我编写了如下JSON Schema:

{
    "required": ["PROP1"],
    "additionalProperties": true,
    "properties": { 
        "PROP1": {"enum": ["PROP1_CHOICE1", "PROP1_CHOICE2"]}
    },
    "allOf": [
        {
            "if": {
                "properties": {
                     "PROP1": {"enum": ["PROP1_CHOICE1"]}
                }
            },
            "then": {
                "required": ["PROP2"],
                "properties": {
                    "PROP2": {"type": "string"},
                }
            },
            "else": false
        },
        {
            "if": {
                "properties": {
                     "PROP1": {"enum": ["PROP1_CHOICE2"]}
                }
            },
            "then": {
                "required": ["PROP2"],
                "properties": {
                    "PROP2": {"type": "boolean"},
                }
            },
            "else": false
        }
    ]
}

当验证以下实例时:

{
    "PROP1": "PROP1_CHOICE1",
    "PROP2": true
}

虽然能得到预期的错误,但错误信息不够精准:

jsonschema.exceptions.ValidationError: False schema does not allow {'PROP1': 'PROP1_CHOICE1', 'PROP2': True}

Failed validating None in schema['allOf'][1]:
    False

On instance:
    {'PROP1': 'PROP1_CHOICE1', 'PROP2': True}

我期望的错误信息应该直接指出PROP2的类型不符合要求,类似这样:

jsonschema.exceptions.ValidationError: True is not of type 'string'

Failed validating 'type' in schema['allOf'][0]['then']['properties']['PROP2']:
    {'type': 'string'}

On instance['PROP2']:
    True

临时方案的弊端

我找到了一个临时解决办法:将if/then/else按顺序嵌套编写:

{
        "required": ["PROP1"],
        "additionalProperties": true,
        "properties": { 
            "PROP1": {"enum": ["PROP1_CHOICE1", "PROP1_CHOICE2"]}
        },
        "if": {
            "properties": {
                "PROP1": {"enum": ["PROP1_CHOICE1"]}
            }
        },
        "then": {
            "required": ["PROP2"],
            "properties": {
                "PROP2": {"type": "string"},
            }
        },
        "else": {
            "if": {
                "properties": {
                        "PROP1": {"enum": ["PROP1_CHOICE2"]}
                }
            },
            "then": {
                "required": ["PROP2"],
                "properties": {
                    "PROP2": {"type": "boolean"},
                }
            },
            "else": false
        }
}

这个写法能输出精准的错误信息,但会导致缩进层级快速增加,在大型Schema中维护起来十分不便。

需求

是否存在一种写法,既能保持第一个示例那样的扁平结构,又能得到精准的错误信息?类似switch/case的无嵌套结构。

内容的提问来源于stack exchange,提问作者Greg7000

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:31:03