Два разных вопроса
{"id": "1"} — совершенно валидный JSON и совершенно неверный, если ваш API
ждёт целое число. Проверка синтаксиса этого не поймает, проверка по схеме
поймает. Инструмент делает и то и другое, именно в таком порядке: схеме нечего
проверять в тексте, который не разбирается.
Как написать схему, от которой есть польза
Минимально полезная схема называет тип, обязательные поля и тип каждого поля:
{
"type": "object",
"required": ["id", "email"],
"properties": {
"id": { "type": "integer", "minimum": 1 },
"email": { "type": "string", "format": "email" }
}
}
Две добавки окупаются быстро. "additionalProperties": false ловит опечатку в
названии ключа, которая иначе просто игнорируется. "minimum", "minLength" и
"enum" ловят значения правильного типа, но бессмысленные по сути.
Где схемы оправдывают себя
- Проверка полезной нагрузки вебхука до того, как на неё среагировали
- Проверка конфигурационного файла в CI, чтобы плохой деплой падал на сборке, а не в проде
- Документирование того, что принимает эндпоинт, в форме, понятной машине
Вопросы
Чем это отличается от форматтера?+
Форматтер отвечает, разбирается ли текст, и делает его читаемым. Валидатор отвечает, правильной ли формы полученные данные: что `id` — целое число, что `email` присутствует, что в `tags` лежат строки. Синтаксис и схема — разные вопросы, и документ может пройти один и провалить другой.
Схема обязательна?+
Нет. Оставьте поле схемы пустым — проверится только синтаксис. Со схемой это превращается в проверку контракта, а именно она нужна перед отправкой в API, который иначе ответит отказом.
Почему выводится сразу несколько ошибок?+
Потому что чинить их по одной долго. Проверка идёт в режиме сбора всех ошибок, поэтому один проход показывает всё, что не так с документом, а не первое попавшееся.
Какие версии JSON Schema поддерживаются?+
Драфты 07, 2019-09 и 2020-12, плюс распространённые форматы строк — email, uri, date, date-time, uuid, ipv4. Проверка форматов включена, поэтому `"format": "email"` действительно отклоняет не-почту, а не служит украшением.