jsonschema 库将数字验证为没有上限的字符串

jsonschema library validate a number as a string with no upper bound

使用:

from jsonschema import validate
import jsonschema

我正在尝试使用 JSON 模式验证字符串的最小值 4096 且没有上限。我看到正则表达式模式匹配可能是一个选项,但不确定如何在没有上限的情况下执行此操作。

json_data = {"value": "4096"}

# what I would like to do
json_schema = {"type": "string", "minimum": 4096}
try:
    validate(json_data, schema=json_schema)
    return True
except jsonschema.ValidationError:
    return False

minimum 关键字不适用于字符串。也许可以使用正则表达式模式来做到这一点,但这将是一个丑陋、糟糕的实现。此要求不太适合 JSON 模式,最好由应用程序的业务逻辑处理。

另一种方法是 create a custom validator,您可以使用它来执行您需要的自定义验证。

import jsonschema

json_schema = {
    'type': 'object',
    'properties': {
        'value': {
            'type': 'string',
            'minimum': 4096,
        },
    }
}


def is_gte(validator, value, instance, schema):
    if not instance.isdigit():
        yield jsonschema.exceptions.ValidationError("Not a number")
    if int(instance) < value:
        yield jsonschema.exceptions.ValidationError("Below required number")

all_validators = dict(jsonschema.Draft7Validator.VALIDATORS)
all_validators['minimum'] = is_gte

CustomValidator = jsonschema.validators.create(
    meta_schema=jsonschema.Draft7Validator.META_SCHEMA,
    validators=all_validators,
)
custom_validator = CustomValidator(json_schema)


for json_data in [
    {"value": 4096},  # Value not a string
    {"value": "4096"},  # Correct
    {"value": "496"},  # Below
    {"value": "13196"},  # above
    {"value": "11a96"},  # Invalid number
]:
    print("=" * 50)
    print(json_data)
    try:
        custom_validator.validate(json_data)
    except jsonschema.ValidationError as error:
        print("Invalid", error)
    else:
        print("Valid")

输出

==================================================
{'value': 4096}
Invalid 4096 is not of type 'string'

Failed validating 'type' in schema['properties']['value']:
    {'minimum': 4096, 'type': 'string'}

On instance['value']:
    4096
==================================================
{'value': '4096'}
Valid
==================================================
{'value': '496'}
Invalid Below required number

Failed validating 'minimum' in schema['properties']['value']:
    {'minimum': 4096, 'type': 'string'}

On instance['value']:
    '496'
==================================================
{'value': '13196'}
Valid
==================================================
{'value': '11a96'}
Invalid Not a number

Failed validating 'minimum' in schema['properties']['value']:
    {'minimum': 4096, 'type': 'string'}

On instance['value']:
    '11a96'

参考: