В JSON-схеме по умолчанию свойства не обязательны , все, что делает ваша схема, это указывает, какого типа они должны быть , если свойство присутствует .Поэтому для проверки того, что additional
отсутствует, необходимо сначала пометить этот ключ как обязательное свойство , добавив список required
с именами:
schema_data = {
"type" : "object",
"properties" : {
"price" : {"type" : "number"},
"name" : {"type" : "string"},
"additional" : {"type" : "number"},
},
"required": ["price", "name", "additional"]
}
Сейчаспроверка не выполнит ваши данные JSON, потому что отсутствует additional
:
>>> validate(json_data, schema_data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/.../site-packages/jsonschema/validators.py", line 541, in validate
cls(schema, *args, **kwargs).validate(instance)
File "/.../site-packages/jsonschema/validators.py", line 130, in validate
raise error
jsonschema.exceptions.ValidationError: 'additional' is a required property
Failed validating 'required' in schema:
{'properties': {'additional': {'type': 'number'},
'name': {'type': 'string'},
'price': {'type': 'number'}},
'required': ['price', 'name', 'additional'],
'type': 'object'}
On instance:
{'name': 'Eggs', 'new': 90, 'price': 34.99}
Чтобы сделать добавление больше ключей недопустимым, вам нужно установить additionalProperties
в false
;по умолчанию разрешены дополнительные свойства:
schema_data = {
"type" : "object",
"properties" : {
"price" : {"type" : "number"},
"name" : {"type" : "string"},
"additional" : {"type" : "number"},
},
"required": ["price", "name", "additional"],
"additionalProperties": False
}
Однако, если additional
по-прежнему отсутствует, добавление ключа new
при использовании validate()
не найдено, поскольку обнаружена первая ошибкавызывается как исключение.
Чтобы получить все ошибки проверки схемы, создайте объект проверки для схемы, а затем используйте метод IValidator.iter_errors()
, чтобы просмотреть все найденные ошибки.:
from json_schema.validators import validator_for
validator = validator_for(schema_data)(schema_data) # get class, create instance
for error in validator.iter_errors(json_data):
print(error)
и теперь вы получаете информацию о каждой ошибке:
'additional' is a required property
Failed validating 'required' in schema:
{'additionalProperties': False,
'properties': {'additional': {'type': 'number'},
'name': {'type': 'string'},
'price': {'type': 'number'}},
'required': ['price', 'name', 'additional'],
'type': 'object'}
On instance:
{'name': 'Eggs', 'new': 90, 'price': 34.99}
Additional properties are not allowed ('new' was unexpected)
Failed validating 'additionalProperties' in schema:
{'additionalProperties': False,
'properties': {'additional': {'type': 'number'},
'name': {'type': 'string'},
'price': {'type': 'number'}},
'required': ['price', 'name', 'additional'],
'type': 'object'}
On instance:
{'name': 'Eggs', 'new': 90, 'price': 34.99}
Каждый error
объект в цикле является ValidatorError
объектом исключения ,который имеет ряд атрибутов, может помочь вам точно определить, в чем проблема, в коде.