Я нашел этот вопрос: пытаюсь создать валидатор схемы JSON в Python для установки значений по умолчанию и корректировки это немного.
Поскольку я использую "jsonschema==3.2.0", я придумал такой код:
Код: Выделить всё
def _with_default_setter_extension(validator_class):
"""Extend validator class with defaults setter.
With this extension, the validator class will set all defaults from a
schema being validated to a validated instance.
"""
def _set_defaults(validator, properties, instance, schema):
if not validator.is_type(instance, "object"):
return
valid = True
for prop, subschema in properties.items():
if prop in instance:
for error in validator.descend(
instance[prop],
subschema,
path=prop,
schema_path=prop,
):
valid = False
yield error
# set defaults only when validation is successful
if valid:
# set root default when instance is empty
if not instance and "default" in schema:
instance.update(schema["default"])
return
for prop, subschema in properties.items():
if "default" in subschema and not isinstance(instance, list):
instance.setdefault(prop, subschema["default"])
return jsonschema.validators.extend(
validator_class, {"properties": _set_defaults}
)
Код: Выделить всё
def test_defaults_from_oneOf_only_defaults_from_valid_schema_are_set():
"""When oneOf is used, I expect only defaults from the valid subschema to be set."""
schema = {
"oneOf": [
{
"properties": {
"p": {"enum": ["one"]},
"params": {"properties": {"q": {"default": 1}}},
}
},
{
"properties": {
"p": {"enum": ["two"]},
"params": {"properties": {"w": {"default": 2}}},
}
},
],
}
assert _VALIDATOR.validate({"p": "two", "params": {}}, schema) == {
"p": "two",
"params": {"w": 2},
}
Код: Выделить всё
AssertionError: assert {'p': 'two', 'params': {'q': 1, 'w': 2}} == {'p': 'two', 'params': {'w': 2}}
+{'p': 'two', 'params': {'q': 1, 'w': 2}}
-{'p': 'two', 'params': {'w': 2}}
Full diff:
- {'p': 'two', 'params': {'w': 2}}
+ {'p': 'two', 'params': {'q': 1, 'w': 2}}
?
При некоторой отладке я обнаружил что когда вы переопределяете только валидатор «свойств», ему не хватает контекста. Поэтому, когда первая подсхема "params" проверяется, у меня нет контекста, сообщающего мне, что проверка параметра "p" не удалась, и мы все еще находимся в той же подсхеме.
Пожалуйста, дайте мне какую-либо информацию. в то, что я мог бы попробовать.
Подробнее здесь: https://stackoverflow.com/questions/728 ... validation
Мобильная версия