python jsonschema 删除附加内容并使用默认值

问题描述 投票:0回答:2

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

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

python jsonschema python-jsonschema
2个回答
6
投票

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

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

要了解为什么它实际上没有做任何事情,请考虑 其他验证器也不会修改该实例。更多的 重要的是,默认修改实例可以产生相当大的效果 奇特的事情。这是完全有效的(甚至可能有用) 有一个默认值在它所在的模式下无效!所以一个 默认修改的实例第一次会通过验证, 但第二次失败了!

不过,填写默认值还是很有用的。 json模式 允许您定义自己的验证器类和可调用对象,因此您 可以轻松创建一个默认的 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


0
投票

要回答如何设置默认值,您可以使用

fill_default
 中的 
jsonschema-fill-default
用其架构填充现有实例中所有缺失的默认值:

pip install jsonschema-fill-default
from jsonschema_fill_default import fill_default

schema = {
    "type": "object",
    "properties": {
        "key_1": {},
        "key_2": {
            "type": "string",
            "default": "do_not_overwrite_if_key_exists",
        },
        "key_3": {
            "type": "string",
            "default": "use_it_if_key_does_not_exist",
        },
    },
    "required": ["key_1"],
}

json_dict = {"key_1": "key_1_value", "key_2": "key_2_value"}

fill_default(json_dict, schema)  # Mutates instance!
>>> json_dict

{"key_1": "key_1_value", "key_2": "key_2_value", "key_3": "use_it_if_key_does_not_exist"}

TomDotTom答案中的代码仅填充“属性”中的默认值,而

fill_default
适用于
"properties"
"allOf"
"anyOf"
"oneOf"
"dependentSchemas"
"if-then(-else)"
的所有嵌套组合,
"prefixItems"
,以及
2020-12 草案
JSON Schema"items"关键字。

© www.soinside.com 2019 - 2024. All rights reserved.