我尝试验证一个jsonschema,该jsonschema定义了一个带有radius
或diameter
或两者都没有的圆,然后只设置一个默认半径。这是我的模式:
{
"properties": {
"position": {},
"radius": {
{ "type": "number" }
},
"diameter": {
{ "type": "number" }
}
},
"oneOf": [
{
"required": ["radius"]
},
{
"required": ["diameter"]
},
{
"properties": {
"radius": {
"default": 16
}
}
}
],
"additionalProperties": false
}
这是设置默认值的验证器(如JSON schema FAQ所述):
from jsonschema import Draft7Validator, validators
def extend_with_default(validator_class):
validate_properties = validator_class.VALIDATORS['properties']
def set_defaults(validator, properties, instance, schema):
for property, subschema in properties.items():
if 'default' in subschema:
instance.setdefault(property, subschema['default'])
for error in validate_properties(
validator, properties, instance, schema,
):
yield error
return validators.extend(
validator_class, {'properties' : set_defaults},
)
Validator = extend_with_default(Draft7Validator)
该验证器在我验证模式之前设置默认值,因此我只能设置半径或两者都不设置,但设置直径将始终引发错误。 如果我将此更改为先验证,然后再设置默认值(我不希望这样,但可以),那么它将设置默认半径,尽管所需的直径已经存在
是否有一些方法可以通过在python中设置默认半径来实现这一点,而无需对其进行硬编码
验证程序不需要更改。这是一个可能的解:
if
仅当未设置半径或直径时才为真。只有这样,才会设置默认半径。之后oneOf
检查是否同时只设置了一个参数相关问题 更多 >
编程相关推荐