JSON a esquema Zod
Pega un JSON de ejemplo, como una respuesta de API o los datos de un formulario, y obtén un esquema Zod listo para usar con esquemas de objetos anidados, arrays, .optional() y .nullable() detectados a partir de tus datos y tipos z.infer exportados. Cambia a Zod 3 o Yup con un clic. Todo se ejecuta en tu navegador.
Última actualización:
Tu JSON se analiza localmente en esta pestaña y nunca se sube. Consejo: Ctrl + Intro genera el código.
Cómo usar JSON a esquema Zod
- Pega un JSON de ejemplo en el cuadro de la izquierda o abre un archivo .json. Si tienes varios ejemplos, pégalos como un array para que se puedan detectar las claves opcionales.
- Ponle nombre al esquema raíz, por ejemplo user, lo que genera userSchema y el tipo User.
- Elige la biblioteca (Zod 4, Zod 3 o Yup) y si los objetos anidados tienen su propio esquema con nombre.
- Ajusta las opciones: detección de opcionales, exportación de tipos, .int(), formatos de string y objetos estrictos.
- Copia o descarga el esquema y valida los datos con userSchema.safeParse(data).
Ejemplo: deducir un esquema Zod a partir de JSON
Al pegar dos pedidos de ejemplo como un array, el generador ve que coupon a veces falta y que note a veces es null:
[ { "id": 1, "email": "[email protected]", "total": 19.99, "note": null, "items": [ { "sku": "A1", "qty": 2 } ] },
{ "id": 2, "email": "[email protected]", "total": 5, "note": "Gift", "coupon": "SAVE10", "items": [] } ]Con el nombre raíz order y Zod 4 seleccionado, el resultado es:
import { z } from 'zod';
export const itemSchema = z.object({
sku: z.string(),
qty: z.number().int(),
});
export const orderSchema = z.object({
id: z.number().int(),
email: z.email(),
total: z.number(),
note: z.string().nullable(),
items: z.array(itemSchema),
coupon: z.string().optional(),
});
export const orderListSchema = z.array(orderSchema);
export type Item = z.infer<typeof itemSchema>;
export type Order = z.infer<typeof orderSchema>;
export type OrderList = z.infer<typeof orderListSchema>;Cómo se asignan los valores JSON a Zod y Yup
| Valor de ejemplo | Zod 4 | Zod 3 | Yup |
|---|---|---|---|
"text" | z.string() | z.string() | yup.string() |
"[email protected]" | z.email() | z.string().email() | yup.string().email() |
"2024-05-01T09:30:00Z" | z.iso.datetime() | z.string().datetime() | yup.string().datetime() |
42 | z.number().int() | z.number().int() | yup.number().integer() |
4.5 | z.number() | z.number() | yup.number() |
true | z.boolean() | z.boolean() | yup.boolean() |
[ … ] | z.array(…) | z.array(…) | yup.array().of(…) |
{} | z.record(z.string(), z.unknown()) | z.record(z.unknown()) | yup.object() |
Valor o null | .nullable() | .nullable() | .nullable().defined() |
| Clave que a veces falta | .optional() | .optional() | (sin .required()) |
Consejos para mejores esquemas
- Usa varios ejemplos. Un solo objeto no puede mostrar qué claves son opcionales. Pega un array de respuestas reales, incluidos casos límite como listas vacías y valores null.
- Ajusta el resultado a mano. La deducción solo ve tu ejemplo. Añade las restricciones que conozcas, como
.min(1),.max(100),.positive()oz.enum(['draft', 'published'])para conjuntos fijos de valores. - Valida en la frontera. Llama a
schema.parse()osafeParse()donde entran datos no confiables en tu app (respuestas de API, envíos de formularios, variables de entorno) y usa el tipo deducido en todo lo demás. - ¿Necesitas un esquema independiente del lenguaje? Usa el Generador de JSON Schema para obtener un JSON Schema draft 2020-12.
Preguntas frecuentes
¿Cómo decide el generador qué es opcional o anulable?
Lee cada valor de tu ejemplo. Una clave que falta en algunos objetos de un array pasa a ser .optional(), un valor que es null en algún sitio pasa a ser .nullable(), y un valor que cumple ambas cosas pasa a ser .nullish(). Con un solo objeto no puede faltar nada, así que para obtener mejores resultados pega un array con varios ejemplos reales. También puedes marcar todos los campos como opcionales.
¿Qué diferencia hay entre la salida de Zod 4 y la de Zod 3?
Zod 4 tiene formatos de string de nivel superior, así que un email es z.email(), una URL z.url() y una marca de tiempo ISO z.iso.datetime(), y z.record() recibe un esquema de clave y otro de valor. Zod 3 usa el estilo de métodos, como z.string().email() y z.string().datetime(). Todo lo demás, incluidos z.object, z.array y z.infer, es igual.
¿Cómo obtengo un tipo TypeScript a partir del esquema?
Con Exportar tipo z.infer activado, cada esquema con nombre recibe un tipo correspondiente, por ejemplo export type User = z.infer<typeof userSchema>. El tipo se deriva del esquema, así que solo mantienes una única fuente de verdad. Para Yup, el generador escribe yup.InferType<typeof userSchema>.
¿Por qué un campo tiene el tipo z.null() o z.union()?
Si un valor es null en todo el ejemplo, no se puede deducir su tipo real, así que el esquema solo acepta null; sustitúyelo por algo como z.string().nullable() cuando lo sepas. Si un campo tiene tipos distintos en distintos lugares, como un string en un elemento y un número en otro, el generador escribe z.union([...]) con cada tipo que encontró.
¿Se detectan siempre los formatos de string como email y UUID?
Un formato solo se añade cuando todos los valores string de ese campo lo cumplen, por ejemplo, cuando todos parecen direcciones de email. Las fechas deben ser marcas de tiempo ISO 8601 completas, como 2024-05-01T09:30:00Z (con { offset: true } cuando el ejemplo usa desfases del estilo +02:00). Desactiva la detección de formatos si tus datos reales no siempre siguen el formato.
¿Yup admite todo lo que admite Zod?
Casi todo. Yup no tiene tipo unión, así que los campos de tipos mixtos pasan a ser yup.mixed(). Los campos obligatorios usan .required(), los campos presentes que pueden ser null usan .nullable().defined(), y las claves que faltan se dejan como opcionales, que es el comportamiento predeterminado de Yup.
¿Se sube mi JSON?
No. Tu JSON se analiza y el esquema se genera con JavaScript en esta página. No se envía nada a ningún servidor.
¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?
Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.