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'
参考:
使用:
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'
参考: