如何用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
相关产品推荐
相关产品推荐

