pythonjsonschema删除额外的设置并使用默认设置

pythonjsonschema删除额外的设置并使用默认设置,python,jsonschema,python-jsonschema,Python,Jsonschema,Python Jsonschema,我正在使用python jsonschema 我试图找到如何使用默认值,并在找到时删除其他字段 有人知道我该怎么做吗? 或者可以使用另一种解决方案来验证支持默认值的jsonschema并删除任何附加字段(如js avj)?隐藏在常见问题解答中,您会发现 为什么我的模式的默认属性不设置我的 实例?基本答案是,规范不要求 默认值实际上可以做任何事情 对于为什么它实际上什么都不做,略知一二,考虑一下。 其他验证程序也不会修改该实例。更多 重要的是,使用默认的修改实例可以产生相当多的错误 奇怪的事情。这

我正在使用python jsonschema 我试图找到如何使用默认值,并在找到时删除其他字段

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

隐藏在常见问题解答中,您会发现

为什么我的模式的默认属性不设置我的 实例?基本答案是,规范不要求 默认值实际上可以做任何事情

对于为什么它实际上什么都不做,略知一二,考虑一下。 其他验证程序也不会修改该实例。更多 重要的是,使用默认的修改实例可以产生相当多的错误 奇怪的事情。这是完全正确的(甚至可能是有用的) 在其所在的架构下,具有无效的默认值!那么 默认修改的实例将在第一次通过验证, 但第二次失败

尽管如此,填写默认值还是很有用的。jsonschema 允许您定义自己的验证器类和可调用项,以便 可以轻松创建一个jsonschema.IValidator,它不执行默认设置 背景这里有一些代码可以帮助您开始。(在此代码中,我们添加 在创建属性之前,将为每个对象设置默认属性 已验证,因此默认值本身需要有效 在模式下。)


From:

库如何使用
默认值
不是由JSON模式定义的,因此该行为不是通用的。“删除其他字段”是什么意思?除了验证JSON之外,您还想用JSON模式做什么?您提到的python包在他们的常见问题解答中有一点关于
default
:看起来他们公开了定制验证代码以使用
default
做些事情的能力。除了验证之外,我希望它设置默认值并删除任何其他字段如果模式说只有a,b是已知的属性,那么如果我得到一个文档{'a':'a','b':'b','c':'c'},那么c将被删除。你所要求的超出了JSON模式的用途。您必须按照我之前评论中的FAQ链接连接到验证器。JSON模式的正常用途是从不修改实例。这一切对你有意义吗?
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'}