Валидация массивов в JSON Schema при использовании Ajv опирается на набор ключевых слов, определяющих структуру, допустимые элементы и ограничения на их количество и уникальность. Работа с элементами массива является одной из наиболее гибких и сложных частей схем, поскольку допускает как однородные коллекции, так и строго позиционные структуры (кортежи), а также комбинированные правила проверки.
Для включения валидации массива достаточно указать тип
array. При этом проверка ограничивается лишь тем, что
значение действительно является массивом JavaScript.
{
"type": "array"
}
Такое определение не накладывает ограничений на содержимое и размер массива, но позволяет отличить его от объектов, строк и других типов.
Дополнительные ограничения вводятся через ключевые слова
items, minItems, maxItems,
uniqueItems.
Наиболее распространённый сценарий — массив, где все элементы имеют
одинаковую структуру. Для этого используется items как
схема одного элемента.
{
"type": "array",
"items": {
"type": "number"
}
}
В таком случае каждый элемент массива проверяется по одной и той же схеме.
Пример допустимого значения:
[1, 2, 3, 4]
Пример недопустимого значения:
[1, "2", 3]
Ключевые слова minItems и maxItems
управляют длиной массива.
{
"type": "array",
"items": { "type": "string" },
"minItems": 2,
"maxItems": 5
}
Значения вне диапазона длины автоматически считаются невалидными.
Ключ uniqueItems включает проверку уникальности всех
элементов массива.
{
"type": "array",
"uniqueItems": true
}
При включении этого параметра происходит глубокое сравнение значений, включая объекты и массивы.
Примеры:
Допустимо:
[1, 2, 3]
Недопустимо:
[1, 1, 2]
В JSON Schema массив может рассматриваться как кортеж, где каждый
индекс соответствует отдельной схеме. В Ajv это реализуется через массив
схем в items.
{
"type": "array",
"items": [
{ "type": "string" },
{ "type": "number" },
{ "type": "boolean" }
]
}
В этом случае:
Пример валидного массива:
["id", 10, true]
Если массив содержит больше элементов, чем определено в массиве схем
items, поведение зависит от версии спецификации и
дополнительных ключевых слов.
По умолчанию лишние элементы допускаются, если не ограничены
additionalItems.
Ключ additionalItems управляет поведением элементов,
выходящих за пределы описанного кортежа.
{
"type": "array",
"items": [
{ "type": "string" },
{ "type": "number" }
],
"additionalItems": false
}
Здесь массив строго ограничен двумя элементами.
Пример допустимого значения:
["name", 42]
Недопустимое:
["name", 42, true]
Также additionalItems может быть схемой, применяемой ко
всем дополнительным элементам:
"additionalItems": { "type": "string" }
В более новых версиях JSON Schema используется
prefixItems, которое заменяет поведение массива схем
items.
{
"type": "array",
"prefixItems": [
{ "type": "string" },
{ "type": "number" }
],
"items": { "type": "boolean" }
}
Здесь:
Ключевое слово contains позволяет проверять наличие хотя
бы одного элемента, соответствующего заданной схеме.
{
"type": "array",
"contains": {
"type": "string",
"pattern": "^A"
}
}
Такой массив должен содержать хотя бы одну строку, начинающуюся с буквы A.
Пример валидного массива:
[1, "Apple", 3]
Дополнительные параметры:
minContainsmaxContains{
"type": "array",
"contains": { "type": "number" },
"minContains": 2,
"maxContains": 4
}
Это задаёт диапазон количества элементов, удовлетворяющих
contains.
Комбинация items и contains позволяет
задавать как общую структуру массива, так и обязательное присутствие
определённых элементов.
{
"type": "array",
"items": { "type": "number" },
"contains": { "const": 0 }
}
Такой массив состоит из чисел и обязан содержать значение 0.
Валидация может применяться рекурсивно:
{
"type": "array",
"items": {
"type": "array",
"items": { "type": "number" }
}
}
Здесь задаётся структура матрицы — массив массивов чисел.
Пример валидного значения:
[[1, 2], [3, 4]]
В Ajv допускается использование логических операторов вместе с массивами:
{
"type": "array",
"items": {
"oneOf": [
{ "type": "string" },
{ "type": "number" }
]
}
}
Каждый элемент массива может принадлежать к одному из допустимых типов.
Валидация массивов может становиться ресурсоёмкой при:
uniqueItems с объектамиcontains с большими массивамиoneOf и anyOfОптимизация обычно достигается через:
Внутренний механизм Ajv позволяет собирать информацию о том, какие
элементы массива прошли проверку, если включён режим verbose или
используется allErrors.
Это особенно важно при диагностике сложных схем, где требуется определить конкретные позиции ошибок в массиве.
При провале валидации массива ошибки обычно содержат:
instancePath)Пример структуры ошибки:
/0/type — ошибка в первом элементе/2/contains — нарушение условия containsТакая структура позволяет точно локализовать источник ошибки внутри массива.