如何修改jsonschema validator源码简化缺失字段错误输出?
修改jsonschema错误输出,隐藏完整Schema仅显示缺失键名
问题场景
使用jsonschema.validators.validator_for验证JSON数据时,若输入缺失Schema要求的必填字段,错误输出会附带完整的Schema内容(我的Schema超过1000行),导致日志冗余。希望调整后仅显示缺失的JSON键名。
当前使用的验证代码:
from jsonschema import validate from jsonschema.validators import validator_for def validator_schema(): sebas_schema = get_schema() validator = validator_for(sebas_schema)(sebas_schema) for error in validator.iter_errors(jsondata): print(error) validator = validator_schema()
方案一:无需修改源码,直接处理错误输出(推荐)
不需要改动库源码,只需修改自己的代码,只打印错误消息部分,而非完整的错误对象:
from jsonschema import validate from jsonschema.validators import validator_for def validator_schema(): sebas_schema = get_schema() validator = validator_for(sebas_schema)(sebas_schema) for error in validator.iter_errors(jsondata): # 只打印错误消息,即缺失的键名提示 print(error.message) validator = validator_schema()
这样输出就只会显示'cycle' is a required property,不会附带完整Schema。
方案二:修改jsonschema源码(不推荐,升级库会失效)
如果一定要修改库源码,步骤如下:
- 找到jsonschema的安装目录:执行
pip show jsonschema,查看Location字段(比如/usr/local/lib/python3.9/site-packages) - 进入该目录下的
jsonschema文件夹,打开exceptions.py文件 - 找到
ValidationError类的__str__方法(不同版本可能对应_format_error方法),原方法会输出错误消息、完整Schema和实例数据,修改为仅返回错误消息:
若需要保留少量上下文,可调整为:def __str__(self): return self.messagedef __str__(self): return f"{self.message}\nFailed validating '{self.validator}' in schema" - 保存文件后,重新运行验证代码即可生效。
注意:修改源码会影响所有使用该库的代码,且升级jsonschema后修改会被覆盖,优先推荐方案一。
内容的提问来源于stack exchange,提问作者Andres Barrera
相关产品推荐
相关产品推荐

