gpt4 book ai didi

python - 从架构中不存在的 JSON 对象中删除属性?

转载 作者:行者123 更新时间:2023-12-03 17:27:28 27 4
gpt4 key购买 nike

我正在使用 Python 的 jsonschema根据架构验证 JSON 文件。它工作得很好。但是现在我需要从我的 JSON 中删除架构中不存在的任何属性。

我知道根据the JSON Schema docs ,我可以设置属性:

additionalProperties = false

拒绝任何具有附加属性的文件。但这只会拒绝属性,而不是实际删除它们。

去除它们的最佳方法是什么?

我想我可以编写自己的脚本:
  • 遍历 JSON 文件的每个叶节点
  • 检查架构中是否存在叶节点
  • 如果没有,则沿着树向上走,直到找到确实存在的最高节点,然后在该点修剪分支。

  • 我的问题是:是否有现有的 Python 库可以做到这一点,还是我需要编写一个?我已经谷歌搜索,但没有任何成功。

    最佳答案

    您可以扩展验证器。类似的 implementation is used for default values .

    有点晚了,但这里有一个解决方案。

    我扩展验证器以覆盖 properties 的验证关键词。如果某个属性存在于实例中但不存在于架构中,我会将其从实例中删除。

    from jsonschema import Draft7Validator, validators

    def extend_validator(validator_class):
    validate_properties = validator_class.VALIDATORS["properties"]

    def remove_additional_properties(validator, properties, instance, schema):
    for prop in list(instance.keys()):
    if prop not in properties:
    del instance[prop]

    for error in validate_properties(
    validator, properties, instance, schema,
    ):
    yield error

    return validators.extend(
    validator_class, {"properties" : remove_additional_properties},
    )

    DefaultValidatingDraft7Validator = extend_validator(Draft7Validator)

    # Example usage:
    obj = {
    'foo': 'bar',
    'not_in_schema': 'no no no'
    }
    schema = {
    'properties': {
    'foo': {
    'type': 'string'
    }
    }
    }

    DefaultValidatingDraft7Validator(schema).validate(obj)
    assert obj == {'foo': 'bar'}

    关于python - 从架构中不存在的 JSON 对象中删除属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44694835/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com