Валидация структуры объекта в JSON Schema включает не только проверку
типов и форматов, но и контроль «плотности» данных — количества
допустимых или обязательных полей. В Ajv этот механизм реализуется через
ключевые ограничения maxProperties и
minProperties, которые позволяют задавать верхнюю и нижнюю
границу количества свойств в объекте.
Свойство maxProperties задаёт предельное количество
ключей в объекте. Если объект содержит больше свойств, чем указано,
валидация считается неуспешной.
{
"type": "object",
"maxProperties": 3
}
В данной схеме объект может содержать не более трёх ключей любого типа и названия.
const schema = {
type: "object",
maxProperties: 2
};
Валидные данные:
{ a: 1, b: 2 }
Невалидные данные:
{ a: 1, b: 2, c: 3 }
Ajv при нарушении ограничения формирует ошибку с указанием ключевого
правила maxProperties.
Ограничение minProperties задаёт минимально допустимое
число ключей. Объект должен содержать не менее указанного количества
свойств, иначе он считается невалидным.
{
"type": "object",
"minProperties": 1
}
const schema = {
type: "object",
minProperties: 2
};
Валидный объект:
{ a: 1, b: 2 }
Невалидный объект:
{ a: 1 }
или
{}
Оба ограничения могут использоваться одновременно для задания диапазона допустимого количества свойств.
{
"type": "object",
"minProperties": 2,
"maxProperties": 4
}
Такой подход часто используется для контроля «структурной плотности» данных, когда объект не должен быть ни пустым, ни чрезмерно насыщенным полями.
Ajv возвращает структурированные ошибки валидации, содержащие:
instancePath)keyword)params)message){
"keyword": "maxProperties",
"instancePath": "",
"params": {
"limit": 2
},
"message": "must NOT have more than 2 properties"
}
{
"keyword": "minProperties",
"instancePath": "",
"params": {
"limit": 2
},
"message": "must NOT have fewer than 2 properties"
}
Ограничение количества свойств часто используется совместно с
additionalProperties. Однако между ними существует
принципиальная разница:
maxProperties ограничивает общее число ключейadditionalProperties управляет допустимостью
неизвестных ключей{
"type": "object",
"maxProperties": 3,
"additionalProperties": false,
"properties": {
"a": { "type": "number" },
"b": { "type": "number" },
"c": { "type": "number" }
}
}
В такой схеме:
В реальных приложениях часто используется частичная валидация, где объект может содержать набор опциональных полей, но их общее число должно оставаться в пределах нормы.
{
"type": "object",
"minProperties": 1,
"maxProperties": 5,
"properties": {
"name": { "type": "string" },
"email": { "type": "string" },
"phone": { "type": "string" },
"address": { "type": "string" },
"age": { "type": "integer" }
}
}
Такая схема допускает гибкость, но ограничивает избыточное расширение объекта.
Ограничения minProperties и maxProperties
применяются только к текущему уровню объекта, а не рекурсивно.
{
"type": "object",
"maxProperties": 2,
"properties": {
"meta": {
"type": "object",
"maxProperties": 5
}
}
}
В этом случае:
meta имеет собственное независимое
ограничениеОграничение количества свойств играет важную роль при работе с динамическими структурами данных, где набор ключей заранее неизвестен.
Контроль числа свойств позволяет предотвратить:
Проверка maxProperties и minProperties
относится к дешёвым операциям. Она выполняется за линейное время
относительно количества ключей объекта.
В Ajv такие проверки не требуют глубокого обхода структуры и не влияют существенно на общую производительность схемы даже при массовой валидации.
Ограничение применяется только к текущему уровню объекта, что часто приводит к неверным ожиданиям при работе с вложенными структурами.
Комбинация строгого запрета дополнительных свойств и жёсткого ограничения количества ключей может приводить к чрезмерно узким схемам.
Установка слишком низкого maxProperties делает схему
негибкой и усложняет эволюцию API.
Ограничение количества свойств в Ajv и JSON Schema используется как инструмент структурного контроля данных. Оно позволяет фиксировать допустимую «сложность» объекта и предотвращать появление неожиданных расширений структуры.
В системах с контрактным взаимодействием между сервисами такие ограничения формируют стабильность формата данных и уменьшают вероятность неконтролируемых изменений в API.