使得检查所有不符合schema不符合的 ,再抛异常

问题

  • 问题表现
@classmethod
def validate_schema(cls, data_obj, schema):
    '''
    验证数据对象是否符合 JSON Schema
    '''
    error_messages = []

    try:
        validate(instance=data_obj, schema=schema, format_checker=FormatChecker())
        print("数据对象符合 JSON Schema")
        return True
    except ValidationError as e:
        error_messages.append(f"数据对象不符合 JSON Schema: {e.message}")

    extra_properties = set(data_obj.keys()) - set(schema.get('properties', {}).keys())
    missing_properties = set(schema.get('properties', {}).keys()) - set(data_obj.keys())

    if extra_properties:
        error_messages.append(f"待验证的 JSON 对象多出以下属性: {extra_properties}")
    if missing_properties:
        error_messages.append(f"待验证的 JSON 对象缺少以下属性: {missing_properties}")

    if error_messages:
        raise Exception('\n'.join(error_messages))

    return False
  • 报错信息
    这个检查到一个异常就停止检查了 怎样改可以使得检查所有不符合schema不符合的 ,再抛异常

产生的原因

validate_schema 旨在验证一个数据对象是否符合 JSON Schema,它在遇到第一个 ValidationError 时就停止了检查,并没有继续检查数据对象中可能存在的额外或缺失的属性。

解决方法

可以使用 jsonschema 库的 Validator 类的 iter_errors 方法:这个方法会返回一个生成器,其中包含所有的验证错误,这样可以迭代所有错误。然后收集所有错误:在迭代所有错误时,将它们添加到一个错误列表中。最后抛出异常:如果错误列表不为空,则将所有错误信息合并为一个字符串,并抛出异常。
参考代码

from jsonschema import validate, ValidationError, FormatChecker, Validator

@classmethod
def validate_schema(cls, data_obj, schema):
    '''
    验证数据对象是否符合 JSON Schema
    '''
    error_messages = []

   validator = Draft7Validator(schema)
    
    # 收集所有的验证错误
    for e in validator.iter_errors(data_obj):
        error_messages.append(f"数据对象不符合 JSON Schema: {e.message}")
    
    # 检查多余的属性
    extra_properties = set(data_obj.keys()) - set(schema.get('properties', {}).keys())
    if extra_properties:
        error_messages.append(f"待验证的 JSON 对象多出以下属性: {extra_properties}")
    
    # 检查缺少的属性
    missing_properties = set(schema.get('properties', {}).keys()) - set(data_obj.keys())
    if missing_properties:
        error_messages.append(f"待验证的 JSON 对象缺少以下属性: {missing_properties}")

    if error_messages:
        raise Exception('\n'.join(error_messages))

    return True

注意: validator = Draft7Validator(schema)这行中 Draft7Validator(schema)里的”7“(数字)应与JSON Schema的版本对应,如果不是7的版本要进行修改