JSON Schema представляет собой декларативное описание структуры данных. В экосистеме Ajv схема используется как входная спецификация для компиляции валидатора, который затем проверяет соответствие данных заданным правилам.
Минимальная схема может выглядеть следующим образом:
{
"type": "object"
}
Ключ type определяет базовый тип значения. В рамках JSON
Schema поддерживаются следующие основные типы:
Комбинирование этих типов формирует основу строгой типизации данных.
При работе с объектами ключевым элементом становится свойство
properties. Оно задаёт допустимые поля и их схемы:
{
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "integer" }
}
}
Каждое свойство внутри properties является
самостоятельной схемой. Это означает возможность рекурсивного описания
вложенных структур любой глубины.
Ключ required определяет список обязательных
свойств:
{
"type": "object",
"properties": {
"id": { "type": "string" },
"email": { "type": "string" }
},
"required": ["id"]
}
Важно: required применяется только к именам свойств, а
не к их значениям.
additionalProperties управляет тем, разрешены ли поля,
не описанные в properties:
true — разрешены любые дополнительные поляfalse — строгий режим без лишних ключей{
"type": "object",
"properties": {
"id": { "type": "string" }
},
"additionalProperties": false
}
Для массивов используется ключ items, определяющий схему
элементов:
{
"type": "array",
"items": {
"type": "number"
}
}
Каждый элемент массива проверяется по указанной схеме.
JSON Schema допускает фиксированную структуру массива:
{
"type": "array",
"items": [
{ "type": "string" },
{ "type": "number" }
]
}
В этом случае первый элемент должен быть строкой, второй — числом.
Дополнительные ключи:
minItemsmaxItemsuniqueItemsПример:
{
"type": "array",
"minItems": 1,
"maxItems": 5,
"uniqueItems": true
}
Сложные структуры описываются через композиционные операторы.
Все схемы должны быть валидны одновременно:
{
"allOf": [
{ "type": "object" },
{ "required": ["id"] }
]
}
Данные должны соответствовать ровно одной схеме:
{
"oneOf": [
{ "type": "string" },
{ "type": "number" }
]
}
Допускается соответствие хотя бы одной схемы:
{
"anyOf": [
{ "type": "string" },
{ "type": "boolean" }
]
}
Одним из ключевых механизмов является $ref, позволяющий
ссылаться на повторно используемые определения.
{
"$ref": "#/definitions/address"
}
Определения размещаются в definitions:
{
"definitions": {
"address": {
"type": "object",
"properties": {
"city": { "type": "string" },
"zip": { "type": "string" }
}
}
}
}
В более современных спецификациях также применяется
$defs, но принцип остаётся идентичным: централизованное
переиспользование блоков схем.
Служебные поля:
$id — уникальный идентификатор схемы$schema — версия спецификации JSON Schematitle — человекочитаемое имяdescription — описание структурыПример:
{
"$id": "https://example.com/schemas/user",
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "User",
"type": "object"
}
Эти поля не участвуют в валидации данных напрямую, но влияют на организацию и интерпретацию схем.
Для примитивных типов используются дополнительные ограничения.
minLengthmaxLengthpatternformat{
"type": "string",
"minLength": 3,
"pattern": "^[a-zA-Z]+$"
}
minimummaximumexclusiveMinimumexclusiveMaximummultipleOf{
"type": "number",
"minimum": 0,
"maximum": 100
}
Ключ enum задаёт фиксированный набор допустимых
значений:
{
"type": "string",
"enum": ["admin", "user", "guest"]
}
Этот механизм часто используется для строгих доменных ограничений.
JSON Schema поддерживает рекурсивные описания через ссылки:
{
"$ref": "#/definitions/node",
"definitions": {
"node": {
"type": "object",
"properties": {
"value": { "type": "string" },
"children": {
"type": "array",
"items": { "$ref": "#/definitions/node" }
}
}
}
}
}
Такая структура применяется при описании деревьев, графов и сложных иерархий.
В Ajv структура схемы напрямую влияет на этап компиляции. Схема преобразуется в оптимизированную функцию проверки, где:
$ref разрешаются в процессе компиляцииГрамотно структурированная схема снижает глубину проверок и ускоряет выполнение валидатора.
JSON Schema в контексте Ajv требует строгой формализации:
Сложные схемы формируются как композиция простых блоков, где каждый уровень отвечает за отдельный аспект валидации данных.