Python JSonschema удалить дополнительные и использовать значения по умолчанию
Я использую Python jsonschema https://python-jsonschema.readthedocs.io/en/latest/ и пытаюсь найти способы использования значений по умолчанию и удаления дополнительных полей при их обнаружении.
Кто-нибудь знает, как мне это сделать? или, может быть, есть другое решение для проверки jsonschema, которая поддерживает значения по умолчанию и удалить любое дополнительное поле (например, js avj)?
1 ответ
Скрытый в часто задаваемых вопросах вы найдете это
Почему свойство по умолчанию моей схемы не устанавливает значение по умолчанию для моего экземпляра? Основной ответ заключается в том, что спецификация не требует, чтобы по умолчанию ничего не делалось.
Для понимания того, почему он на самом деле ничего не делает, учтите, что ни один из других валидаторов тоже не изменяет экземпляр. Что еще более важно, изменение по умолчанию экземпляра может привести к довольно странным вещам. Вполне допустимо (и, возможно, даже полезно) иметь значение по умолчанию, которое недопустимо в схеме, в которой он живет! Таким образом, экземпляр, измененный по умолчанию, прошел бы проверку в первый раз, но не прошел бы второй!
Тем не менее, заполнение значений по умолчанию является полезным. jsonschema позволяет вам определять свои собственные классы валидаторов и вызываемые объекты, так что вы можете легко создать jsonschema.IValidator, который выполняет настройку по умолчанию. Вот код, который поможет вам начать. (В этом коде мы добавляем свойства по умолчанию к каждому объекту перед проверкой свойств, поэтому сами значения по умолчанию должны быть действительными в схеме.)
from jsonschema import Draft4Validator, 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.iteritems():
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},
)
DefaultValidatingDraft4Validator = extend_with_default(Draft4Validator)
# Example usage:
obj = {}
schema = {'properties': {'foo': {'default': 'bar'}}}
# Note jsonschem.validate(obj, schema, cls=DefaultValidatingDraft4Validator)
# will not work because the metaschema contains `default` directives.
DefaultValidatingDraft4Validator(schema).validate(obj)
assert obj == {'foo': 'bar'}