JSON Schema
Nuevo — Zod 4 introduce una nueva característica: conversión nativa a JSON Schema. JSON Schema es un estándar para describir la estructura de JSON (con JSON). Es ampliamente utilizado en definiciones OpenAPI y para definir salidas estructuradas para IA.
Para convertir un esquema de Zod a JSON Schema, usa la función z.toJSONSchema().
Todos los esquemas y comprobaciones se convierten a su equivalente más cercano en JSON Schema. Algunos tipos no tienen análogo y no pueden representarse razonablemente. Consulta la sección unrepresentable a continuación para obtener más información sobre cómo manejar estos casos.
Formatos de cadena
Zod convierte los siguientes tipos de esquema al format equivalente de JSON Schema:
Estos esquemas son soportados vía contentEncoding:
Todos los otros formatos de cadena son soportados vía pattern:
Tipos numéricos
Zod convierte los siguientes tipos numéricos a JSON Schema:
Esquemas de objetos
Por defecto, los esquemas z.object() contienen additionalProperties: "false". Esta es una representación precisa del comportamiento predeterminado de Zod, ya que el esquema z.object() simple elimina las propiedades adicionales.
Al convertir a JSON Schema en modo "input", additionalProperties no se establece. Consulta la documentación de io para más información.
Por el contrario:
z.looseObject()nunca estableceráadditionalProperties: falsez.strictObject()siempre estableceráadditionalProperties: false
Esquemas de archivos
Zod convierte z.file() al siguiente esquema compatible con OpenAPI:
Las comprobaciones de tamaño y MIME también se representan:
Nulabilidad
Zod convierte z.null() a { type: "null" } en JSON Schema.
Ten en cuenta que z.undefined() no se puede representar en JSON Schema (ver abajo).
De manera similar, nullable se representa mediante una unión con null:
Los esquemas opcionales se representan tal cual, aunque están decorados con una anotación optional.
Configuración
Se puede utilizar un segundo argumento para personalizar la lógica de conversión.
A continuación se muestra una referencia rápida para cada parámetro admitido. Cada uno se explica con más detalle a continuación.
target
Para establecer la versión de destino de JSON Schema, usa el parámetro target. Por defecto, Zod apuntará a Draft 2020-12.
metadata
Si aún no lo has hecho, lee la página de Metadatos y registros para obtener contexto sobre el almacenamiento de metadatos en Zod.
En Zod, los metadatos se almacenan en registros. Zod exporta un registro global z.globalRegistry que se puede usar para almacenar campos de metadatos comunes como id, title, description y examples.
Todos los campos de metadatos se copian en el JSON Schema resultante.
unrepresentable
Las siguientes API no son representables en JSON Schema. Por defecto, Zod lanzará un error si se encuentran. No es sólido intentar una conversión a JSON Schema; debes modificar tus esquemas ya que no tienen equivalente en JSON. Se lanzará un error si se encuentra alguno de estos.
Por defecto, Zod lanzará un error si se encuentra alguno de estos.
Puedes cambiar este comportamiento estableciendo la opción unrepresentable en "any". Esto convertirá cualquier tipo irrepresentable en {} (el equivalente a unknown en JSON Schema).
cycles
Cómo manejar ciclos. Si se encuentra un ciclo mientras z.toJSONSchema() recorre el esquema, se representará usando $ref.
Si prefieres lanzar un error, establece la opción cycles en "throw".
reused
Cómo manejar esquemas que ocurren múltiples veces en el mismo esquema. Por defecto, Zod insertará estos esquemas en línea.
En su lugar, puedes establecer la opción reused en "ref" para extraer estos esquemas en $defs.
override
Para definir alguna lógica de anulación personalizada, usa override. La devolución de llamada proporcionada tiene acceso al esquema Zod original y al JSON Schema predeterminado. Esta función debe modificar directamente ctx.jsonSchema.
Ten en cuenta que los tipos irrepresentables lanzarán un Error antes de que se llame a esta función. Si estás tratando de definir un comportamiento personalizado para un tipo irrepresentable, deberás usar la configuración unrepresentable: "any" junto con override.
io
Algunos tipos de esquema tienen diferentes tipos de entrada y salida, por ejemplo, ZodPipe, ZodDefault y primitivos coercionados. Por defecto, el resultado de z.toJSONSchema representa el tipo de salida; usa "io": "input" para extraer el tipo de entrada en su lugar.
Registros (Registries)
Pasar un esquema a z.toJSONSchema() devolverá un JSON Schema autocontenido.
En otros casos, es posible que tengas un conjunto de esquemas de Zod que te gustaría representar utilizando múltiples JSON Schemas interconectados, tal vez para escribir en archivos .json y servirlos desde un servidor web.
Para lograr esto, puedes pasar un registro a z.toJSONSchema().
Importante — ¡Todos los esquemas deben tener una propiedad id registrada en el registro! Cualquier esquema sin un id será ignorado.
Por defecto, las URIs de $ref son rutas relativas simples como "User". Para convertirlas en URIs absolutas, usa la opción uri. Esto espera una función que convierta un id en una URI totalmente calificada.

