如何通过Python的jsonschema提取缺失必填键的ValidationError信息?
提取jsonschema验证中缺失的必填键信息
可以通过两种可靠方式提取缺失的必填键,无需依赖消息文本的临时方案:
方法1:利用ValidationError属性推导缺失字段
当验证失败原因是缺失必填字段时,ValidationError的validator属性值为"required",validator_value对应schema里的required字段列表,instance则是当前验证的JSON对象。通过对比必填列表与实例的键集合,即可找出缺失字段:
import jsonschema schema = { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "name": {"type": "string"}, "email": {"type": "string"} }, "required": ["name", "email"] } jsonToValidate = {"name": 1234} validator = jsonschema.Draft202012Validator(schema) errors = {} for err in validator.iter_errors(jsonToValidate): if err.path: # 类型错误等有路径的问题,直接取路径首元素作为键 key = err.path[0] errors[key] = err.message elif err.validator == "required": # 计算缺失的必填字段 missing_fields = set(err.validator_value) - set(err.instance.keys()) for field in missing_fields: errors[field] = f"'{field}' is a required property" print(errors)
方法2:从错误消息中提取字段名
若确定错误消息格式固定,可使用正则表达式直接提取字段名,实现更简洁:
import jsonschema import re schema = { "$schema": "https://json-schema.org/draft/2020-12/schema", "type": "object", "properties": { "name": {"type": "string"}, "email": {"type": "string"} }, "required": ["name", "email"] } jsonToValidate = {"name": 1234} validator = jsonschema.Draft202012Validator(schema) errors = {} required_pattern = re.compile(r"'(\w+)' is a required property") for err in validator.iter_errors(jsonToValidate): if err.path: key = err.path[0] errors[key] = err.message else: match = required_pattern.search(err.message) if match: key = match.group(1) errors[key] = err.message print(errors)
两种方法运行后都会得到期望输出:
{ "name": "1234 is not of type 'string'", "email": "'email' is a required property" }
内容的提问来源于stack exchange,提问作者MrHutnik
相关产品推荐
相关产品推荐

