Ajv — высокопроизводительный валидатор JSON Schema для JavaScript, ориентированный на строгую проверку данных, компиляцию схем в оптимизированные функции и поддержку современных спецификаций стандарта JSON Schema (draft-07, 2019-09, 2020-12 в зависимости от версии).
Основой работы является преобразование JSON Schema в исполняемую функцию проверки. При первом вызове схема компилируется, после чего повторные проверки выполняются без повторного разбора структуры схемы.
Ключевой принцип:
схема → компиляция → валидирующая функция → многократное использование
Такой подход позволяет значительно снизить накладные расходы по сравнению с интерпретируемой проверкой.
import Ajv from "ajv";
const ajv = new Ajv();
Создание экземпляра валидатора предполагает конфигурацию поведения:
strict — строгая проверка схемallErrors — сбор всех ошибок, а не остановка на
первойcoerceTypes — автоматическое приведение типовremoveAdditional — удаление лишних полейПример конфигурации:
const ajv = new Ajv({
allErrors: true,
coerceTypes: true,
strict: true
});
JSON Schema описывает структуру объекта:
const schema = {
type: "object",
properties: {
name: { type: "string" },
age: { type: "number" }
},
required: ["name", "age"],
additionalProperties: false
};
const validate = ajv.compile(schema);
const data = { name: "Ivan", age: 30 };
const valid = validate(data);
Результат проверки доступен через булево значение, а ошибки — в
validate.errors.
Ошибки представляют собой массив объектов:
validate.errors;
Типичная структура:
instancePath — путь к ошибочному полюmessage — текст ошибкиkeyword — правило схемыparams — параметры нарушенияПример анализа:
if (!validate(data)) {
console.log(validate.errors);
}
Определяет тип значения:
{ type: "string" }
{ type: "number" }
{ type: "object" }
Описание структуры объекта:
properties: {
id: { type: "integer" },
title: { type: "string" }
}
Массив обязательных полей:
required: ["id", "title"]
Контроль лишних полей:
additionalProperties: false
Главная особенность Ajv — предварительная компиляция схемы в функцию.
При компиляции происходит:
Это делает выполнение валидации сопоставимым по скорости с ручной проверкой условий.
Компилированные функции можно использовать многократно:
const validateUser = ajv.compile(userSchema);
validateUser(user1);
validateUser(user2);
validateUser(user3);
Это исключает повторную компиляцию и ускоряет обработку больших потоков данных.
JSON Schema поддерживает рекурсивные описания:
const schema = {
type: "object",
properties: {
node: {
type: "object",
properties: {
value: { type: "number" },
next: { $ref: "#" }
}
}
}
};
Механизм $ref позволяет переиспользовать определения и
строить сложные графы объектов.
Ajv поддерживает расширение через форматы:
ajv.addFormat("uppercase", {
type: "string",
validate: (data) => data === data.toUpperCase()
});
Использование:
const schema = {
type: "string",
format: "uppercase"
};
Расширение логики через свои правила:
ajv.addKeyword({
keyword: "isEven",
type: "number",
validate: (schema, data) => data % 2 === 0
});
Схема:
const schema = {
type: "number",
isEven: true
};
Поддерживаются ограничения:
const schema = {
type: "array",
items: { type: "number" },
minItems: 1,
maxItems: 5,
uniqueItems: true
};
JSON Schema позволяет описывать зависимости:
const schema = {
type: "object",
properties: {
type: { enum: ["A", "B"] },
value: { type: "string" }
},
if: {
properties: { type: { const: "A" } }
},
then: {
required: ["value"]
}
};
const schema = {
type: ["string", "null"]
};
Используется для совместимости с API, где значение может отсутствовать.
В строгом режиме выявляются:
const ajv = new Ajv({ strict: true });
Это важно для предотвращения скрытых логических ошибок.
Поддерживаются асинхронные проверки, например обращение к базе данных:
ajv.addKeyword({
keyword: "existsInDB",
async: true,
validate: async (schema, data) => {
return await checkInDatabase(data);
}
});
В этом случае validate возвращает Promise.
Ajv интегрируется с TypeScript через генерацию типов:
Внутренний механизм включает:
Это особенно важно при высоконагруженных API.
Ошибки можно форматировать:
ajv.errorsText(validate.errors);
Либо анализировать вручную для построения структурированных ответов API.
const schema = {
$id: "user.json",
type: "object",
properties: {
address: { $ref: "address.json" }
}
};
Позволяет строить модульные схемы.
Типичный подход:
Такой подход снижает дублирование и повышает согласованность структуры данных.