Перейти к содержанию

JSON в схему Zod

Генерируйте Zod-схему валидации и типы TypeScript из примера JSON с автоматическим обнаружением форматов и перечислений.

Входные данные
Выходные данные

JSON в схему Zod

Вставьте пример JSON — ответ API, файл конфигурации, строку базы данных — и получите готовую к использованию Zod-схему в TypeScript. Типы выводятся для каждого поля: примитивы отображаются на z.string(), z.number() и z.boolean(), массивы имеют выведённый тип элемента, а значение, которое отличается между вхождениями, становится z.union(). Строка, которая выглядит как адрес электронной почты, URL, UUID или дата ISO, получает соответствующий валидатор — .email(), .url(), .uuid(), .date() или .datetime() — вместо обычного z.string().

Передайте ему массив одинаково сформированных объектов, таких как строки из конечной точки списка, и генератор объединяет каждый элемент перед типизацией поля: ключ, отсутствующий в некоторых строках, становится .optional(), ключ, который иногда равен null, становится .nullable() или .optional() в зависимости от выбранного параметра, а поле, которое повторяет небольшой набор значений — столбец статуса или роли — становится правильным z.enum() вместо открытой строки. Включите «Разделить вложенные объекты», чтобы извлечь каждый вложенный объект в свой собственный именованный экспорт вместо одного глубоко вложенного литерала, где идентичные формы автоматически делят одну схему. Включите «Строгие объекты», чтобы отклонить любой ключ, который образец никогда не показывал, отлавливая опечатки и неожиданные поля API при разборе вместо позже в потоке.

Назовите экспортированную схему так, как ваш код её ожидает, и при необходимости добавьте export type X = z.infer<typeof X> прямо ниже, чтобы валидатор среды выполнения и тип компиляции поступали из одного источника и никогда не могли молча расойтись.

Всё работает локально в вашем браузере. JSON, который вы вставляете — ответы API с токенами, записи пользователей, внутренние полезные нагрузки — анализируется и типизируется полностью на вашем устройстве и никогда не загружается никуда. Вставьте образец, скопируйте созданную схему в свой проект и начните валидировать то, что вы анализируете.

FAQ

Как выбирается между .optional() и .nullable()?
Ключ, отсутствующий в некоторых образцах массива, всегда является .optional() — нет других способов разрешить отсутствующий ключ. Ключ, который присутствует но иногда равен null, неоднозначен, поэтому параметр «Обработка null» решает: nullable точно типизирует его с .nullable(), optional рассматривает значение null как отсутствующее.
Как обрабатываются вложенные объекты?
По умолчанию вложенный объект типизируется встроенным образом, прямо там, где он появляется. Включите «Разделить вложенные объекты», чтобы каждой вложенной форме было своё export const ...Schema, и идентичные формы автоматически делят одну схему вместо её дублирования.
Когда поле становится z.enum() вместо z.string()?
Когда опция «Определить перечисления» включена и поле повторяет небольшой набор различных значений строк — от 2 до 5 — в массиве образцов, такой как столбец статуса или категории. Поле только с уникальными значениями или слишком многими различными остаётся z.string().
Что делает опция «Строгие объекты»?
Она добавляет .strict() к каждому сгенерированному z.object(), поэтому разбор завершается ошибкой, если входные данные содержат ключ, который образец никогда не показывал — полезно для отлавливания опечаток или неообъявленных добавлений API вместо их молчаливого игнорирования.
Мой JSON загружается где-нибудь?
Нет. Схема генерируется полностью в вашем браузере — ваш JSON никогда не покидает ваше устройство.