JSON инструменты · 6 минута чтения
Схема от JSON до JSON: от образца полезной нагрузки до
Преобразование схемы JSON в JSON берет пример, который работает, и создает машиночитаемое описание его формы. Это описание может проверять будущие полезные данные, генерировать документацию или управлять типизированным кодом — но только если вы рассматриваете сгенерированную схему как первый черновик. Вывод видит один образец, и один образец — это очень уверенный лжец.
Обновлено
Что умозаключение может и не может видеть
Хороший преобразователь из одного документа точно извлекает типы, вложенность, формы элементов массива и имена свойств. Чего он не может вывести, так это намерения. Он не знает, что поле является необязательным, поскольку оно включено в данную конкретную запись, что строка представляет собой адрес электронной почты, что число является положительным целым числом или что значение происходит из фиксированного набора. Поэтому все производные данные помечаются цифрой `required`, что является правильным значением по умолчанию для проекта контракта и неправильным для отправки без проверки.
Усиление сгенерированной схемы
- Сравните два или три реальных образца: ключи, отсутствующие ни в одном образце, должны выпасть из `required`.
- Добавьте `format` там, где значение известно — `date-time`, `email`, `uri`, `uuid`, `ipv4`.
- Превратите открытые наборы в значения `enum`, если поле действительно имеет фиксированный словарь, например статус или регион.
- Закрепите числа цифрами `minimum`, `maximum` и `multipleOf`, чтобы отрицательная величина не могла быть подтверждена.
- Добавляйте `additionalProperties: false` только в том случае, если неизвестные ключи должны быть отклонены — в противном случае оставьте схему открытой для прямой совместимости.
Требуется обещание, а не наблюдение. Пометка поля как обязательного, поскольку оно содержится в одном образце, является наиболее распространенным способом, которым предполагаемая схема нарушает реальную интеграцию.
Где схема заслужила свое существование
Практическая ценность проявляется на границах: проверка полезной нагрузки веб-перехватчика перед тем, как ему доверять, проверка файлов фикстур в CI, чтобы тесты проваливались из-за неверных данных, а не из-за запутанных нулевых ошибок, документирование ответа API для людей, которые никогда не будут читать серверный код, и генерация типизированных клиентов. Схема JSON также является самым дешевым способом помешать изменению конфигурации незаметно изменить публичный ответ, поскольку валидатор улавливает его во время сборки, а не во время производства.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"required": ["id", "email"],
"properties": {
"id": { "type": "string", "format": "uuid" },
"email": { "type": "string", "format": "email" },
"plan": { "type": "string", "enum": ["free", "pro", "team"] }
}
}
Держите это под контролем версий
Сгенерированные схемы исчезают в тот момент, когда ими никто не владеет. Зафиксируйте защищенный файл рядом с кодом, который создает данные, ссылайтесь на него из валидатора в CI и перегенерируйте только тогда, когда контракт действительно изменится, рассматривая схему как источник истины для формы, а образец как доказательство, а не наоборот.
Вывод в браузере
Реальные полезные данные полны идентификаторов, адресов электронной почты и токенов, поэтому преобразование схемы JSON в JSON, при котором загружается образец, означает передачу производственных данных для чисто механической операции. Локальный вывод сохраняет полезную нагрузку на вкладке, позволяет вставить запись о клиенте, не задумываясь, и работает при отключенной сети.
Схема от JSON до JSON — часто задаваемые вопросы
Почему каждое поле отображается так, как требуется?
Потому что вывод видит одну выборку, и эта выборка содержит все поля. Требование означает гарантию, поэтому сгенерированная схема является отправной точкой: сравните несколько образцов, затем удалите ключи, которые иногда отсутствуют, и добавьте ограничения `format` или `enum` там, где вы знаете реальные правила.
Какой проект схемы JSON мне следует использовать?
Черновик 2020-12 для новой работы — это текущая спецификация, которая хорошо поддерживается такими валидаторами, как ajv. Если вы интегрируетесь с системой, привязанной к проекту-07, продолжайте создавать документы проекта-07; они отличаются главным образом новыми ключевыми словами, которые вам, вероятно, не понадобятся.
Может ли схема JSON проверять и массивы?
Да. Вывод массива создает схему `items`, описывающую форму элемента, а форму отдельного элемента можно проверить с помощью `prefixItems` в современных проектах. Объедините два образца с элементами разной формы, и вы увидите, где нужен `oneOf`.
Инструменты, упомянутые в этом посте
Еще статьи для чтения
6 минута чтения
От JSON до TypeScript: типы, соответствующие реальности
Преобразуйте интерфейсы JSON в TypeScript из реального ответа API — необязательные ключи, нулевые объединения, вложенные типы — и не допускайте смещения сгенерированных типов.
6 минута чтения
JSON форматтер: красивый, минимизированный и действительно
Средство форматирования JSON, которое красиво печатает, минимизирует и проверяет точные местоположения ошибок, а также пять синтаксических ошибок, стоящих почти за каждой недопустимой ошибкой JSON.
6 минута чтения
JSON diff: сравнение данных в том виде, в каком они на самом
Сравните две полезные нагрузки JSON со структурным различием JSON, которое игнорирует порядок ключей и пробелы, выделяет перемещенные значения и показывает, почему текстовые различия вводят в заблуждение.
- Более длинная статья для чтения: От JSON до TypeScript: типы, которые говорят правду