问题
- 问题表现
@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的版本要进行修改