Ограничения по длине в JSON Schema формируют один из базовых механизмов контроля входных данных, особенно при валидации строк, массивов и частично объектов. В Ajv эти ограничения реализуются строго в соответствии со спецификацией JSON Schema Draft 7/2019-09/2020-12, что обеспечивает предсказуемое поведение при проверке структур данных.
Для строк используются ключевые слова minLength и
maxLength, которые определяют допустимый диапазон длины
строки в символах.
const schema = {
type: "string",
minLength: 5,
maxLength: 10
};
const ajv = new Ajv();
const validate = ajv.compile(schema);
validate("hello"); // true
validate("hi"); // false (слишком короткая строка)
validate("very long string"); // false (слишком длинная)
Важный аспект заключается в том, что длина строки в JSON Schema определяется количеством Unicode-символов, а не байтов. Это приводит к следующим нюансам:
В контексте Ajv проверка опирается на внутреннее представление строки JavaScript, а не на байтовую длину.
Для массивов используются minItems и
maxItems, определяющие допустимое количество элементов.
const schema = {
type: "array",
minItems: 2,
maxItems: 4
};
const ajv = new Ajv();
const validate = ajv.compile(schema);
validate([1]); // false
validate([1, 2]); // true
validate([1, 2, 3, 4]); // true
validate([1, 2, 3, 4, 5]); // false
Ограничения применяются к количеству элементов, независимо от их типа:
Дополнительно часто комбинируются с items,
prefixItems и additionalItems, что позволяет
задавать строгую структуру массива вместе с ограничением длины.
Хотя термин “длина” чаще относится к строкам и массивам, в JSON
Schema аналогичный механизм применяется к объектам через
minProperties и maxProperties.
const schema = {
type: "object",
minProperties: 1,
maxProperties: 3
};
const ajv = new Ajv();
const validate = ajv.compile(schema);
validate({}); // false
validate({ a: 1 }); // true
validate({ a: 1, b: 2, c: 3 }); // true
validate({ a: 1, b: 2, c: 3, d: 4 }); // false
В Ajv подсчёт свойств ведётся по собственным enumerable keys объекта.
Ограничения длины часто используются совместно с другими правилами валидации:
const schema = {
type: "string",
minLength: 3,
maxLength: 8,
pattern: "^[a-zA-Z]+$"
};
Такой подход позволяет одновременно:
Комбинация ограничений повышает точность валидации и снижает вероятность некорректных данных на уровне бизнес-логики.
При нарушении ограничений длины Ajv формирует структурированное сообщение об ошибке, содержащее:
minLength, maxLength,
minItems, maxItems);Пример типичного результата:
{
"instancePath": "",
"keyword": "minLength",
"message": "must NOT have fewer than 5 characters",
"params": {
"limit": 5
}
}
Такая детализация позволяет точно локализовать причину несоответствия без дополнительного анализа входных данных.
Проверки длины относятся к дешёвым операциям, так как:
Тем не менее, при работе с очень большими структурами:
наблюдается линейное увеличение времени проверки, что следует учитывать при массовой валидации.
Ограничения длины применяются только к значениям корректного типа:
minLength и maxLength игнорируются для
нестроковых значений;minItems и maxItems применяются только к
массивам;minProperties и maxProperties применяются
только к объектам.Ajv при включённом строгом режиме может дополнительно сигнализировать о некорректных схемах, где ограничения применены к несовместимым типам.
Распространённые проблемы:
minLength для чисел вместо строк;minItems и бизнес-логикой
(например, обязательные поля массива).Такие ошибки часто приводят к некорректной валидации даже при правильно составленной схеме.
В реальных схемах ограничения длины редко используются изолированно. Типичный шаблон включает:
const schema = {
type: "array",
minItems: 1,
maxItems: 10,
items: {
type: "string",
minLength: 2,
maxLength: 20
}
};
Такой подход задаёт многоуровневую валидацию:
В Ajv это компилируется в оптимизированную функцию, минимизирующую накладные расходы при повторных проверках.