JSON и схемы

Ключевое слово enum в JSON Schema: допустимые значения и примеры

Ключевое слово enum валидирует поле только в том случае, если его значение в точности совпадает с одним из элементов указанного массива.

Опубликовано

Пример JSON Schema enum

Схема:

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": ["active", "pending", "disabled"]
    }
  },
  "required": ["status"]
}

Валидный JSON

{
  "status": "active"
}

Невалидный JSON

{
  "status": "deleted"
}

deleted не входит в список допустимых значений enum, поэтому такой JSON не проходит проверку по данной JSON Schema.

Проверить JSON по JSON Schema →

Как работает ключевое слово enum

Проверка проходит, если значение совпадает с одним из элементов списка. Регистр строк и тип JSON-значения имеют значение.

{
  "type": "string",
  "enum": ["active", "pending", "disabled"]
}

Строки, числа, логические значения и null

В enum перечисляют JSON-значения. Число 1, строка "1", логическое значение true и null — четыре разных варианта. Допустимы также массивы и объекты.

{ "enum": [1, "1", true, null] }

Как разрешить null в JSON Schema enum

Если схема содержит и type, и enum, значение должно удовлетворять обоим ограничениям. Чтобы разрешить null, укажите "null" среди разрешённых типов и JSON-значение null в списке enum. Добавить его только в одно ограничение недостаточно.

{
  "type": ["string", "null"],
  "enum": ["active", "pending", null]
}

enum в свойствах объекта

{
  "type": "object",
  "properties": { "status": { "enum": ["active", "pending"] } },
  "required": ["status"]
}

Чтобы управлять дополнительными ключами объекта, настройте additionalProperties.

JSON Schema enum внутри массива

Если каждый элемент массива должен принадлежать фиксированному набору значений, задайте enum внутри items. Массив ["read", "write"] пройдёт проверку, а ["read", "admin"] — нет: "admin" отсутствует в списке.

{
  "type": "array",
  "items": {
    "type": "string",
    "enum": ["read", "write", "delete"]
  }
}

В руководстве по массивам в JSON Schema разобраны ограничения элементов и массива в целом.

Разница между enum и const

Ключевое слово const задает ровно одно допустимое константное значение (например, type: "user").

Ключевое словоКогда использоватьПример
enumДопустимы несколько значенийactive | pending
constДопустимо ровно одно значениеkind = user

Если допустимые значения различаются между ветвями схемы, сравните oneOf, anyOf и allOf и выберите подходящее правило объединения.

Регистр и частые ошибки

  • Строки Active и active различаются.
  • Ключевое слово enum не делает свойство обязательным: для этого нужен required.
  • Число и строка с теми же цифрами не взаимозаменяемы.
  • По одному примеру генератор не может определить все значения, которые будут допустимы в будущем.

Создайте основу схемы, уточните правила и проверьте значения

Сначала сгенерируйте структуру по типичным JSON-данным. Затем добавьте допустимые значения enum в соответствии с требованиями приложения и проверьте в JSON Schema Validator как разрешённые, так и запрещённые варианты.

Частые вопросы

Как использовать enum в JSON Schema?

Укажите в enum фиксированный список допустимых JSON-значений. Пример допускает две строки при соблюдении остальных ограничений схемы.

{ "type": "string", "enum": ["active", "pending"] }

Может ли JSON Schema enum содержать числа, boolean или null?

Да. enum может содержать JSON-значения разных типов, если они соответствуют остальной схеме. Пример допускает число, логическое значение и null.

{ "enum": [1, true, null] }

Чем enum отличается от const?

enum задаёт список допустимых значений и подходит для нескольких вариантов. const разрешает ровно одно конкретное значение.

Проверьте пример

Создайте базовую схему по данным со статусом

Начните с реальной структуры объекта, затем добавьте осознанное ограничение enum.

{"status":"active","role":"admin"}

Ожидаемый результат: Генератор определит строковые свойства, но не придумает отсутствующие в примере допустимые значения.

Проверьте пример

Отклоните значение вне enum

Проверьте статус archived по утверждённому списку статусов.

enum: [active, pending, disabled]
значение: archived

Ожидаемый результат: Проверка завершится ошибкой по пути /status: archived отсутствует в enum.

Генератор схем

Сгенерируйте базовую схему

Создайте схему по примеру JSON и добавьте допустимые значения enum.

Открыть генератор JSON Schema →