Валидация диапазонов значений в Ajv строится на использовании ограничений, накладываемых на числовые и строковые данные через JSON Schema. Поддерживаются проверки минимальных и максимальных границ, строгие и нестрогие включения пределов, а также комбинирование условий для формирования сложных правил.
Для числовых значений используются ключи:
Простейшая схема диапазона выглядит следующим образом:
{
"type": "number",
"minimum": 10,
"maximum": 20
}
Такая схема допускает любые числа от 10 до 20 включительно.
Различие между включительными и исключительными границами критично при построении строгих ограничений.
Включительные границы:
{
"type": "number",
"minimum": 10,
"maximum": 20
}
Исключительные границы:
{
"type": "number",
"exclusiveMinimum": 10,
"exclusiveMaximum": 20
}
В этом случае допустимы значения строго больше 10 и строго меньше 20.
Также возможно комбинирование:
{
"type": "number",
"minimum": 10,
"exclusiveMaximum": 20
}
Такой вариант допускает 10, но исключает 20.
В современных версиях JSON Schema (и, соответственно, Ajv)
допускается использование числовых значений для
exclusiveMinimum и exclusiveMaximum, что
позволяет задавать границы без отдельного ключа minimum или
maximum.
Пример:
{
"type": "number",
"exclusiveMinimum": 10
}
Здесь все значения должны быть строго больше 10.
Аналогично:
{
"type": "number",
"exclusiveMaximum": 100
}
Ограничения диапазона одинаково применимы к типу
integer:
{
"type": "integer",
"minimum": 1,
"maximum": 100
}
Дополнительно можно комбинировать с проверкой кратности:
{
"type": "integer",
"minimum": 0,
"maximum": 100,
"multipleOf": 5
}
Такое описание ограничивает значения числами 0, 5, 10, …, 100.
Ajv строго учитывает тип значения. Это означает, что диапазоны
применяются только после успешной проверки type.
Пример:
{
"type": "number",
"minimum": 0
}
Строка "10" не будет автоматически преобразована в число
и не пройдёт валидацию.
Хотя термин «диапазон» чаще относится к числам, в JSON Schema аналогичная логика применяется к строкам через свойства:
Пример:
{
"type": "string",
"minLength": 5,
"maxLength": 10
}
Такое ограничение задаёт допустимую длину строки.
Для массивов применяются аналогичные концепции:
{
"type": "array",
"minItems": 1,
"maxItems": 5
}
Это задаёт диапазон количества элементов.
Диапазоны часто используются вместе с другими правилами для формирования сложных валидаторов.
Пример комбинированной схемы:
{
"type": "object",
"properties": {
"age": {
"type": "integer",
"minimum": 18,
"maximum": 65
},
"score": {
"type": "number",
"exclusiveMinimum": 0,
"maximum": 100
}
},
"required": ["age", "score"]
}
Здесь одновременно задаются разные типы диапазонов для разных полей.
При нарушении границ Ajv формирует объект ошибки, содержащий:
instancePath)keyword)params)message)Пример ошибки при выходе за пределы:
{
"instancePath": "/age",
"keyword": "minimum",
"params": {
"comparison": ">=",
"limit": 18
}
}
Проверки диапазонов являются одними из наиболее быстрых операций в Ajv, поскольку:
Особенно эффективно работают схемы с фиксированными границами, так как компилятор Ajv превращает их в прямые сравнения без дополнительных абстракций.
Диапазоны часто применяются в следующих задачах:
Пример пагинации:
{
"type": "object",
"properties": {
"page": {
"type": "integer",
"minimum": 1
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 100
}
}
}
Диапазоны могут комбинироваться с форматами данных:
{
"type": "number",
"minimum": 0,
"maximum": 1,
"format": "float"
}
Однако формат не влияет на проверку диапазона, он используется отдельно для семантической интерпретации значения.
Типичные проблемы при использовании диапазонов:
minimum и maximum (например,
minimum > maximum)Пример некорректной схемы:
{
"type": "number",
"minimum": 50,
"maximum": 10
}
Такая схема логически противоречива и приведёт к невозможности прохождения валидации.
В сложных системах диапазоны часто уточняются постепенно:
Такой подход позволяет избежать преждевременного ужесточения правил и снижает количество ошибок валидации на ранних этапах разработки.