De JSON a modelos TypeScript, Zod y Pydantic

Genera interfaces TypeScript, esquemas Zod y modelos Pydantic desde un ejemplo JSON en esta página. La salida se comprueba con tsc --strict, Zod 3 y 4, y Pydantic 2 antes de publicarse.

Se ejecuta localmente en tu navegador
Sample JSON

Pega una respuesta de API, un fixture o un objeto de configuración. La muestra permanece en este navegador.

Generated code
Generate from a JSON sample to create TypeScript types.

La inferencia se basa en la muestra proporcionada. Revisa IDs, valores nullable, cadenas de fecha y restricciones de negocio antes de usar los tipos generados en producción.

Cómo generar las tres salidas

Pega un ejemplo JSON, ponle nombre al tipo raíz y pulsa Generar tipos: obtendrás la misma estructura en TypeScript, Zod y Pydantic, cada una en su pestaña. El ejemplo se procesa en esta página con el propio navegador; no se sube nada ni se envía en ninguna petición.

Los nombres inferidos se comprueban con compiladores reales antes de publicar: la salida TypeScript pasa tsc --strict, el esquema Zod valida su propio ejemplo con Zod 3 y Zod 4, y los modelos Pydantic se importan y validan el ejemplo con Pydantic 2.

  1. Pega un ejemplo JSON: una respuesta de API, un fixture o un objeto de configuración.
  2. Define el nombre del tipo raíz; los espacios, guiones y guiones bajos se convierten en un nombre capitalizado.
  3. Pulsa Generar tipos (o Cargar ejemplo para ver uno ya relleno) y cambia entre las pestañas TypeScript, Zod y Pydantic.
  4. Pulsa Copiar código visible para la pestaña abierta y revisa los campos opcionales y anulables antes de confiar en ellos.

Qué deduce el generador y dónde se detiene

Las tres salidas

Un objeto JSON se convierte en una interfaz (o en un alias de tipo cuando el ejemplo es un array o un valor suelto), los arrays en Array<…> y un objeto vacío en Record<string, unknown>. Zod recibe la misma estructura como esquema más un tipo z.infer, y Pydantic recibe una clase BaseModel por objeto con List, Optional, Union y Dict de typing.

La casilla Export declarations decide si las líneas de TypeScript y Zod llevan export; la salida de Pydantic es Python normal en ambos casos.

Arrays y campos opcionales

Se fusionan todas las entradas de un array: la clave que solo aparece en parte de los objetos queda opcional (role?: string en TypeScript, .optional() en Zod, Optional[…] = None en Pydantic) y la clave con valores de distinto tipo se convierte en una unión. Los objetos mezclados con escalares o con null también producen una unión, y null nunca oculta el otro tipo: se conserva a su lado.

Un array vacío es unknown / z.unknown() / List[Any], porque una muestra sin elementos no aporta información de tipo.

Nombres que hay que renombrar

Las claves que Python no puede escribir conservan su grafía JSON como alias: {"a-b": 1} pasa a a_b con alias="a-b", y class, import o None pasan a class_, import_ o None_ para que el archivo se importe. Las claves model_config, model_dump y cualquier otra que empiece por model_ también reciben sufijo, porque Pydantic reserva ese espacio de nombres.

Dos claves que si no se fundirían en un solo campo se mantienen separadas: {"a-b": 1, "a_b": 2} da a_b y a_b_2 con sus propios alias, y los objetos anidados con nombres en conflicto reciben clases distintas.

Límites y privacidad

Todo ocurre en la pestaña: la conversión no envía ninguna petición y el ejemplo desaparece al recargar. Un ejemplo de 2 MB se tipa en unos 0,35 s en Chrome.

Los tipos salen de un solo ejemplo, así que describen lo que contiene ese documento: las claves opcionales son las que faltan en parte del array, no las que tu API pueda omitir, y los textos siguen siendo string — no se adivinan formatos de correo, fecha ni UUID. El analizador JSON del navegador lee el ejemplo, así que los enteros mayores que 2^53 pierden precisión y acaban como float en la salida de Pydantic.

Herramientas recientes: