Saltar al contenido

JSON a esquema Zod

Genera un esquema de validación Zod y tipos TypeScript a partir de una muestra JSON, con detección de formatos y enumeraciones.

Entrada
Salida

JSON a esquema Zod

Pega una muestra JSON — una respuesta de API, un archivo de configuración, una fila de base de datos — y obtén un esquema Zod listo para usar en TypeScript. Los tipos se infieren por campo: los primitivos se asignan a z.string(), z.number() y z.boolean(), los arrays tienen su tipo de elemento inferido, y un valor que difiere entre ocurrencias se convierte en z.union(). Una cadena que parece una dirección de correo, URL, UUID o fecha ISO obtiene el validador coincidente — .email(), .url(), .uuid(), .date() o .datetime() — en lugar de un z.string() simple.

Dale un array de objetos de la misma forma, como filas de un endpoint de lista, y el generador fusiona cada elemento antes de tipificar el campo: una clave que falta en algunas filas se vuelve .optional(), una clave que a veces es nula se vuelve .nullable() u .optional() según la opción que elijas, y un campo que repite un pequeño conjunto de valores — una columna de estado o rol — se convierte en un z.enum() adecuado en lugar de una cadena abierta. Activa "Dividir objetos anidados" para extraer cada objeto anidado a su propia exportación nombrada en lugar de un literal profundamente anidado, donde las formas idénticas comparten automáticamente un esquema. Activa "Objetos estrictos" para rechazar cualquier clave que la muestra nunca mostró, detectando errores tipográficos y campos API inesperados al analizar en lugar de más adelante.

Nombra el esquema exportado según lo que espere tu código y, opcionalmente, añade export type X = z.infer<typeof X> justo debajo, para que el validador en tiempo de ejecución y el tipo en tiempo de compilación provengan de la misma fuente y nunca puedan divergir silenciosamente.

Todo se ejecuta localmente en tu navegador. El JSON que pegas — respuestas de API con tokens, registros de usuarios, cargas internas — se analiza y se tipifica completamente en tu dispositivo y nunca se sube a ningún lugar. Pega una muestra, copia el esquema generado en tu proyecto y empieza a validar lo que analizas.

Preguntas frecuentes

¿Cómo decide entre .optional() y .nullable()?
Una clave que falta en algunas muestras de array es siempre .optional() — no hay otra forma de permitir una clave faltante. Una clave que está presente pero a veces es nula es ambigua, así que la opción "Manejo de null" decide: nullable la tipifica con precisión con .nullable(), optional trata un valor nulo como si faltara.
¿Cómo se manejan los objetos anidados?
Por defecto, un objeto anidado se tipifica en línea, exactamente donde aparece. Activa "Dividir objetos anidados" para dar a cada forma anidada su propio export const ...Schema y las formas idénticas comparten automáticamente un esquema en lugar de duplicarlo.
¿Cuándo un campo se convierte en z.enum() en lugar de z.string()?
Cuando "Detectar enumeraciones" está activado y un campo repite un pequeño conjunto de valores de cadena distintos — de 2 a 5 — en un array de muestras, como una columna de estado o categoría. Un campo con solo valores únicos o demasiados distintos permanece como z.string().
¿Qué hace "Objetos estrictos"?
Añade .strict() a cada z.object() generado, por lo que el análisis falla si la entrada contiene una clave que la muestra nunca mostró — útil para detectar errores tipográficos o adiciones inesperadas de API en lugar de ignorarlas silenciosamente.
¿Se sube mi JSON a algún lugar?
No. El esquema se genera completamente en tu navegador — tu JSON nunca abandona tu dispositivo.