3

我正在使用 python jsonschema https://python-jsonschema.readthedocs.io/en/latest/ 并且我试图找到如何使用默认值并在找到时删除其他字段。

有人知道我该怎么做吗?或者可能有另一个解决方案来验证支持默认值并删除任何附加字段(如 js avj)的 jsonschema?

4

1 回答 1

6

隐藏在常见问题解答中你会发现这个

为什么我的架构的默认属性没有在我的实例上设置默认值?基本答案是规范不要求默认值实际执行任何操作。

要了解为什么它实际上没有做任何事情,请考虑其他验证器也没有修改该实例。更重要的是,默认修改实例会产生非常奇怪的东西。在其所在的架构下具有无效的默认值是完全有效的(甚至可能有用)!因此,默认修改的实例将第一次通过验证,但第二次失败!

尽管如此,填写默认值还是很有用的。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'}

来自:https ://python-jsonschema.readthedocs.io/en/latest/faq/#why-doesn-t-my-schema-s-default-property-set-the-default-on-my-instance

于 2018-03-29T15:37:58.640 回答