我正在使用python jsonschema https://python-jsonschema.readthedocs.io/en/latest/ 我正在尝试找到如何使用默认值并在找到时删除其他字段。
任何人都知道我该怎么做? 或者可能有另一个解决方案来验证支持默认值的jsonschema并删除任何其他字段(如js avj)?
答案 0 :(得分:4)
隐藏在常见问题解答中,你会发现这个
为什么我的架构的默认属性没有设置我的默认属性 实例?基本答案是规范不要求 那个默认实际上做了什么。
关于为什么它实际上没有做任何事情,请考虑一下 没有其他验证器也修改实例。更多 重要的是,具有默认修改实例可以产生相当的 奇特的事情。它完全有效(甚至可能有用) 有一个默认在它所在的架构下无效!所以 默认修改的实例将在第一次通过验证, 但第二次失败了!
尽管如此,填写默认值是有用的。 jsonschema 允许您定义自己的验证器类和callables,所以你 可以轻松创建一个默认的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'}