从JSON对象中删除不在模式中的属性?

11

我正在使用Python的jsonschema库来验证JSON文件是否符合指定的格式。它运作得非常好。但现在我需要删除JSON中那些在定义中不存在的属性。

根据JSON Schema文档,我可以设置一个属性来完成这个操作:

additionalProperties = false

拒绝具有额外属性的文件。但这只会拒绝这些属性,而不是删除它们。

最好的方法是什么?

我想我可以编写自己的脚本:

  • 遍历JSON文件的每个叶节点
  • 检查该叶节点是否存在于模式中
  • 如果不存在,则向上遍历树直到找到最高的存在节点,然后在该点处修剪分支。

我的问题是:是否有现成的Python库可以执行此操作,还是我需要编写一个库? 我已经谷歌搜索了,但没有任何成功。


2
你解决了吗?我在C#中也遇到了同样的情况。 - MARKAND Bhatt
我也对这个用例很感兴趣,并打开了一个 GitHub Issue - Daniel Himmelstein
在 Ruby 中遇到了相同的问题:https://stackoverflow.com/questions/60569726/how-to-remove-in-a-hash-the-properties-that-do-not-exists-in-its-json-schema - gordie
2个回答

3
您可以扩展验证器。与默认值类似的实现用于默认值
有点晚了,但这是一个解决方案。
我扩展了验证器来覆盖属性关键字的验证。如果实例中存在某个属性但不在模式中,则从实例中删除它。
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'}

@Richard 这解决了你的问题吗? - Raphael Medaer

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接