Elo*_*ati 2 python jsonschema python-jsonschema
我正在使用python jsonschema https://python-jsonschema.readthedocs.io/en/latest/, 并且我试图找到如何使用默认值并在找到时删除其他字段。
有人知道我应该怎么做吗?还是有另一种解决方案来验证支持默认值的jsonschema并删除任何其他字段(例如js avj)?
隐藏在常见问题中,您会发现
为什么我的架构的default属性没有在实例上设置默认值?基本答案是,该规范不要求默认值实际执行任何操作。
要弄清楚为什么它实际上不执行任何操作,请考虑其他验证器均未修改该实例。更重要的是,使用默认值修改实例可能会产生一些奇怪的事情。在存在的模式下具有默认值是无效的,这是完全有效的(甚至可能有用)!因此,默认情况下修改的实例将在第一次通过验证,但是第二次通过!
尽管如此,填写默认值还是很有用的。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'}
Run Code Online (Sandbox Code Playgroud)
来自:https : //python-jsonschema.readthedocs.io/en/latest/faq/#why-doesn-t-my-schema-s-default-property-set-the-default-on-my-instance
| 归档时间: |
|
| 查看次数: |
717 次 |
| 最近记录: |