Документация / JSON Schema
Условия
Иногда правила зависят от значения другого поля: для юрлица нужен ИНН из 10 цифр, для индивидуального предпринимателя — из 12. Для этого есть условные ключевые слова.
if, then, else
Если документ проходит схему if, он должен пройти и схему then; иначе — схему else. Сама схема if не делает
документ невалидным: её результат только выбирает ветвь.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"kind": { "enum": ["company", "entrepreneur"] },
"inn": { "type": "string" }
},
"required": ["kind", "inn"],
"if": {
"properties": { "kind": { "const": "company" } }
},
"then": {
"properties": { "inn": { "pattern": "^\\d{10}$" } }
},
"else": {
"properties": { "inn": { "pattern": "^\\d{12}$" } }
}
}
{ "kind": "entrepreneur", "inn": "500100732259" }
{ "kind": "company", "inn": "500100732259" }
Обратите внимание: в if проверяется только properties.kind. Если бы kind мог отсутствовать, схема
{ "properties": { "kind": { "const": "company" } } } была бы выполнена и для объекта без kind — ведь
properties проверяет только существующие поля. В таких случаях добавляйте в if ещё и "required": ["kind"].
Несколько условий
Каждое условие оборачивают в свой элемент allOf:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"country": { "enum": ["RU", "BY"] },
"postalCode": { "type": "string" }
},
"allOf": [
{
"if": { "properties": { "country": { "const": "RU" } }, "required": ["country"] },
"then": { "properties": { "postalCode": { "pattern": "^\\d{6}$" } } }
},
{
"if": { "properties": { "country": { "const": "BY" } }, "required": ["country"] },
"then": { "properties": { "postalCode": { "pattern": "^2\\d{5}$" } } }
}
]
}
{ "country": "RU", "postalCode": "101000" }
dependentSchemas
dependentSchemas применяет схему ко всему объекту, если в нём есть указанное свойство. Это более мощная версия
dependentRequired (см. «Объекты»).
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"discountCode": { "type": "string" }
},
"dependentSchemas": {
"discountCode": {
"properties": { "total": { "type": "number", "minimum": 1000 } },
"required": ["total"]
}
}
}
{ "discountCode": "SALE10", "total": 500 }
Импликация через anyOf
Правило «если A, то B» можно выразить и без if: «не A или B».
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"description": "Если доставка курьером, нужен адрес",
"type": "object",
"anyOf": [
{ "not": { "properties": { "delivery": { "const": "courier" } }, "required": ["delivery"] } },
{ "required": ["address"] }
]
}
{ "delivery": "courier" }
Похожие инструменты
Обновлено: 30 сентября 2026 г.
