You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:52:30