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.
Как работает ключевое слово 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.