我正在使用 python jsonschema https://python-jsonschema.readthedocs.io/en/latest/ 我正在尝试找到如何使用默认值并在找到时删除其他字段。
有人知道我该怎么做吗? 或者也许有另一个解决方案来验证支持默认值的 jsonschema 并删除任何附加字段(如 js avj)?
隐藏在常见问题解答中,您会发现这个
为什么我的模式的默认属性没有设置我的默认值 实例?基本的答案是规范不要求 这个默认值实际上可以做任何事情。
要了解为什么它实际上没有做任何事情,请考虑 其他验证器也不会修改该实例。更多的 重要的是,默认修改实例可以产生相当大的效果 奇特的事情。这是完全有效的(甚至可能有用) 有一个默认值在它所在的模式下无效!所以一个 默认修改的实例第一次会通过验证, 但第二次失败了!
不过,填写默认值还是很有用的。 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'}
要回答如何设置默认值,您可以使用
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"
关键字。