Валидация строковых значений в JSON Schema часто требует не только
проверки типа данных, но и строгого соответствия определённым шаблонам:
email-адресам, URL, датам, IP-адресам и другим стандартизированным
представлениям. В Ajv такие проверки реализуются через механизм форматов
(formats), которые задаются свойством format в JSON
Schema.
Формат в Ajv — это дополнительное ограничение для значений строкового
типа. Он проверяется после основной валидации типа string и
позволяет накладывать семантические ограничения.
Пример использования:
const schema = {
type: "object",
properties: {
email: { type: "string", format: "email" }
}
};
В данном случае строка должна не только быть строкой, но и соответствовать формату email-адреса.
Ajv не всегда включает поддержку всех форматов по умолчанию. В
современных версиях библиотеки часть форматов подключается через
дополнительный пакет ajv-formats.
import Ajv from "ajv";
import addFormats from "ajv-formats";
const ajv = new Ajv();
addFormats(ajv);
После подключения становятся доступны стандартные форматы, определённые спецификацией JSON Schema Draft 7 и выше.
Формат email проверяет соответствие строки
RFC-совместимому email-адресу.
Пример схемы:
{
type: "string",
format: "email"
}
Допустимые значения:
user@example.comname.surname@domain.orgНедопустимые:
user@@domain.comВнутренняя проверка в Ajv достаточно строгая, но при необходимости может быть заменена или расширена кастомным валидатором.
Формат uri проверяет соответствие строки универсальному
идентификатору ресурса.
Пример:
{
type: "string",
format: "uri"
}
Допустимые значения:
https://example.comftp://server.local/resourceurn:isbn:0451450523Ajv проверяет корректность схемы URI, включая протокол и структуру адреса.
Этот формат допускает как абсолютные, так и относительные URI.
Пример:
/users/1../assets/image.pnghttps://example.com/pageВ отличие от uri, здесь допускаются относительные пути,
что важно для веб-приложений и конфигурационных файлов.
Формат uuid используется для проверки универсальных
уникальных идентификаторов.
{
type: "string",
format: "uuid"
}
Поддерживаются стандартные представления UUID:
550e8400-e29b-41d4-a716-446655440000Проверка включает соответствие формату 8-4-4-4-12 и допустимым шестнадцатеричным символам.
Формат date-time соответствует RFC 3339 и ISO 8601.
Пример:
2024-01-15T13:45:30Z2024-01-15T13:45:30+05:00Ajv проверяет:
ZФормат date используется для проверки даты без
времени:
2024-01-15Важно отличие от date-time: отсутствие временной
составляющей является обязательным условием.
Формат time проверяет строку времени:
13:45:3023:59:59.999Поддерживаются доли секунды и строгая структура HH:MM:SS.
Формат ipv4 используется для проверки IPv4-адресов:
192.168.0.18.8.8.8Проверка включает:
Формат ipv6 проверяет IPv6-адреса:
2001:0db8:85a3:0000:0000:8a2e:0370:73342001:db8::1Поддерживаются правила сокращения нулевых блоков.
Формат hostname проверяет доменные имена:
example.comsub.domain.orgОграничения:
Формат regex проверяет корректность регулярного
выражения.
{
type: "string",
format: "regex"
}
Примеры:
^[a-z]+$\d{3}-\d{2}-\d{4}Проверяется только синтаксис, а не соответствие строке.
В Ajv форматы могут работать в разных режимах строгости.
При включённой поддержке форматов через ajv-formats
используется полноценная проверка значений.
Форматы можно отключить:
const ajv = new Ajv({ formats: false });
В этом случае format не будет влиять на результат
валидации.
Ajv позволяет определять собственные форматы, расширяя встроенный набор.
ajv.addFormat("postal-code", {
type: "string",
validate: (code) => /^\d{5}$/.test(code)
});
Использование:
{
type: "string",
format: "postal-code"
}
Кастомные форматы полезны для:
При несоответствии формату Ajv генерирует ошибку валидации с указанием:
instancePath)keyword: "format")Пример ошибки:
{
"keyword": "format",
"message": "must match format \"email\"",
"instancePath": "/email"
}
Форматы могут влиять на производительность валидации, особенно при массовой обработке данных.
Рекомендации:
ajv-formats только при необходимостиПоддержка форматов зависит от версии JSON Schema:
Ajv стремится к соответствию спецификации, но реализация форматов остаётся частично расширяемой областью, где допускаются пользовательские определения и переопределения стандартных проверок.