【问题标题】:python jsonschema remove additional and use defaultspython jsonschema 删除额外的并使用默认值
【发布时间】:2018-03-06 13:10:20
【问题描述】:

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

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

【问题讨论】:

  • 库如何使用default 不是由 JSON Schema 定义的,因此行为并不通用。 “删除其他字段”是什么意思?除了验证 JSON 之外,您还试图用 JSON Schema 做什么?
  • 你提到的 python 包在他们的常见问题解答中有一点关于defaultpython-jsonschema.readthedocs.io/en/latest/faq/… 看起来他们公开了自定义验证代码以使用default 做某事的能力。
  • 除了验证之外,我希望它设置默认值并删除为 eample 提供的任何附加字段,如果架构说只有 a、b 是已知属性,那么如果我得到一个文档 {'a' :'a', 'b':'b', 'c' :'c'} - 然后 c 将被删除
  • 您所要求的超出了 JSON Schema 的用途。您必须按照我之前评论中的常见问题解答链接连接到验证器。 JSON Schema 的正常用途是从不修改实例。你觉得这一切都有意义吗?

标签: python jsonschema python-jsonschema


【解决方案1】:

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

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

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

不过,填写默认值还是很有用的。 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

【讨论】:

    猜你喜欢
    • 2015-02-24
    • 2023-03-31
    • 2018-09-02
    • 2013-02-24
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2023-01-18
    相关资源
    最近更新 更多