100 % local: tus datos nunca salen de tu navegador

JSON a Zod — valida en la frontera

Convierte una muestra JSON en esquemas Zod. Un esquema por objeto, declarado antes de usarse, y z.infer te da el tipo TypeScript desde la misma fuente.

Instantáneo Privado Cero cookies

Entrada JSON

Salida Zod

Qué hace esta herramienta

Una muestra JSON pasa a ser esquemas de Zod, un const por objeto.

{ "id": 1, "name": "Ada", "address": { "city": "Paris" } }
import { z } from "zod";

export const AddressSchema = z.object({
  city: z.string(),
});

export const RootSchema = z.object({
  id: z.int(),
  name: z.string(),
  address: AddressSchema,
});

Los hijos van primero: son constantes de ejecución, y un esquema debe existir antes de que otro lo mencione.

Los números se leen como se escribieron

z.int() para un entero, z.number() para todo lo que lleve punto decimal o exponente:

{ "price": 10.0, "quantity": 3 }
price: z.number(),
quantity: z.int(),

Hasta hace poco price salía como z.int(): 10.0 se analiza como un número entero y nada guardaba el literal. El esquema rechazaba entonces 10.5, el registro siguiente con toda probabilidad. JSON tiene un solo tipo numérico: la forma escrita es el único testimonio de lo que quiso el productor, y ahora la conversión la lee. El defecto se encontró al escribir esta página y se corrigió.

Sintaxis de Zod 4

z.int() es la escritura de Zod 4. En Zod 3, escribe z.number().int(); nada más difiere entre las dos versiones en esta salida.

Lo que una muestra no puede decidir por ti

  • Nada es .optional(). Una clave vista una vez puede aparecer; si aparece siempre no está en el documento.
  • null da z.null(), un esquema que no acepta nada más. Si el campo es «una cadena, a veces ausente», el .nullable() te toca a ti.
  • Las claves desconocidas se quitan, no se rechazan, porque es el comportamiento por defecto de Zod. .strict() es una decisión sobre tu API.
  • Un array heterogéneo pasa a unión: [1, "a"] da z.array(z.union([z.int(), z.string()])), que describe la muestra con exactitud y quizá sea más ancho que tus datos reales.

Cada uno de estos puntos es un sitio donde el esquema generado es solo un punto de partida, y la página lo dice en vez de dejar que lo descubras en revisión.

Privado por diseño

Todo se ejecuta localmente en tu navegador con JavaScript. Tus datos nunca se suben a un servidor, lo que hace que la herramienta sea segura para contenido sensible y funcione sin conexión.

Preguntas frecuentes

¿Por qué `10.0` da `z.number()` y `3` un `z.int()`?
Porque así están escritos. JSON tiene un solo tipo numérico: la única pista sobre el original es el literal, donde un punto decimal o un exponente delatan un flotante. `10.0` salía como `z.int()`, y el esquema rechazaba entonces 10.5, el registro siguiente. Era un defecto real, corregido.
¿Existe `z.int()` en Zod 3?
No, llegó con Zod 4. En la versión 3 lo mismo se escribe `z.number().int()`, y basta un reemplazo. Todo lo demás de la salida —`z.object`, `z.array`, `z.union`, `z.null`— es idéntico entre las dos versiones.
¿El esquema rechaza las claves desconocidas?
No. `z.object()` quita lo que no conoce en vez de fallar: es el comportamiento por defecto de Zod y aquí se conserva. Si una clave de más debe ser un error, añade `.strict()` tú mismo: es una decisión sobre tu API, no algo que una muestra pueda decirnos.

Convertidores relacionados