Документация / 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 г.