如何让jsonschema校验错误提示包含最小长度要求?
解决jsonschema自定义minLength错误提示的问题
首先要修正你提供的待校验内容——它不是合法JSON格式,JSON要求对象的键必须用双引号包裹,修正后如下:
{ "name": "Josh" }
默认的jsonschema错误提示确实不会包含具体的长度数值,要实现你想要的提示效果,可以通过两种方式自定义错误消息:
方法一:捕获ValidationError后手动格式化
直接捕获校验抛出的ValidationError,提取错误中的实例值、要求的最小长度等关键信息,拼接成自定义提示:
import jsonschema from jsonschema.exceptions import ValidationError # 定义draft-04 schema schema = { "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "properties": { "name": { "type": "string", "minLength": 5 } }, "additionalProperties": False } # 待校验的合法JSON数据 data = {"name": "Josh"} try: jsonschema.validate(instance=data, schema=schema) except ValidationError as e: if e.validator == "minLength": # 提取关键信息生成自定义提示 instance_val = repr(e.instance) required_min = e.schema["minLength"] print(f"字符串{instance_val}小于要求的最小长度{required_min}") else: # 其他类型错误保留原提示 print(e.message)
运行后会输出:字符串'Josh'小于要求的最小长度5,完全符合你的需求。
方法二:全局自定义错误消息模板
如果需要对所有校验场景统一自定义错误提示,可以通过继承默认验证器类,替换指定校验规则的消息模板:
import jsonschema from jsonschema.validators import Draft4Validator # 自定义minLength错误消息生成逻辑 def min_length_error_msg(error): return f"字符串{repr(error.instance)}小于要求的最小长度{error.schema['minLength']}" # 继承Draft4Validator,替换错误消息模板 class CustomValidator(Draft4Validator): def __init__(self, schema, *args, **kwargs): super().__init__(schema, *args, **kwargs) self._error_messages["minLength"] = min_length_error_msg # 使用自定义验证器校验 schema = { "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "properties": { "name": { "type": "string", "minLength": 5 } }, "additionalProperties": False } data = {"name": "Josh"} validator = CustomValidator(schema) for error in validator.iter_errors(data): if error.validator == "minLength": print(min_length_error_msg(error)) else: print(error.message)
这种方式适合需要批量处理多种校验规则错误提示的场景,能统一管控所有校验的输出格式。
内容的提问来源于stack exchange,提问作者user692431
相关产品推荐
相关产品推荐

