Zod 4 представляет новую функцию: встроенное преобразование JSON Schema. JSON Schema — это стандарт для описания структуры JSON (с помощью JSON). Он широко используется в определениях OpenAPI и определении структурированных выводов для ИИ.
Чтобы преобразовать схему Zod в схему JSON, используйте функцию z.toJSONSchema().
Все схемы и проверки преобразуются в наиболее близкий эквивалент JSON Schema. Некоторые типы не имеют аналогов и не могут быть адекватно представлены. Дополнительные сведения об обработке таких случаев см. в разделе unrepresentable ниже.
По умолчанию схемы z.object() содержат additionalProperties: "false". Это точно отражает поведение Zod по умолчанию, поскольку простая схема z.object() удаляет дополнительные свойства.
interfaceToJSONSchemaParams{/** The JSON Schema version to target. * - `"draft-2020-12"` — Default. JSON Schema Draft 2020-12 * - `"draft-7"` — JSON Schema Draft 7 */target?:'draft-7'|'draft-2020-12';/** A registry used to look up metadata for each schema. * Any schema with an `id` property will be extracted as a $def. */metadata?:$ZodRegistry<Record<string,any>>;/** How to handle unrepresentable types. * - `"throw"` — Default. Unrepresentable types throw an error * - `"any"` — Unrepresentable types become `{}` */unrepresentable?:'throw'|'any';/** How to handle cycles. * - `"ref"` — Default. Cycles will be broken using $defs * - `"throw"` — Cycles will throw an error if encountered */cycles?:'ref'|'throw';/* How to handle reused schemas. * - `"inline"` — Default. Reused schemas will be inlined * - `"ref"` — Reused schemas will be extracted as $defs */reused?:'ref'|'inline';/** A function used to convert `id` values to URIs to be used in *external* $refs. * * Default is `(id) => id`. */uri?:(id:string)=>string;}
Если вы еще не сделали этого, прочтите страницу Метаданные и реестры, чтобы узнать о хранении метаданных в Zod.
В Zod метаданные хранятся в реестрах. Zod экспортирует глобальный реестр z.globalRegistry, который можно использовать для хранения общих полей метаданных, таких как id, title, description и examples.
1 2 3 4 5 6 7 8 910
import*aszfrom'zod';// `.meta()` is a convenience method for registering a schema in `z.globalRegistry`constemailSchema=z.string().meta({title:'Email address',description:'Your email address',});z.toJSONSchema(emailSchema);// => { type: "string", title: "Email address", description: "Your email address", ... }
Все поля метаданных копируются в результирующую схему JSON.
Следующие API не могут быть представлены в JSON Schema. По умолчанию Zod выдаст ошибку, если они будут обнаружены. Попытка преобразования в JSON Schema нецелесообразна; вам следует изменить свои схемы, поскольку они не имеют эквивалента в JSON. При обнаружении любого из них будет выведена ошибка.
По умолчанию Zod выдаст ошибку, если встретит любое из этих событий.
12
z.toJSONSchema(z.bigint());// => throws Error
Вы можете изменить это поведение, установив для параметра unrepresentable значение "any". Это приведет к преобразованию всех непредставимых типов в {} (эквивалент unknown в JSON Schema).
Чтобы определить некоторую пользовательскую логику переопределения, используйте override. Предоставленный обратный вызов имеет доступ к исходной схеме Zod и схеме JSON по умолчанию. Эта функция должна напрямую изменять ctx.jsonSchema.
1 2 3 4 5 6 7 8 91011
constmySchema=/* ... */z.toJSONSchema(mySchema,{override:(ctx)=>{ctx.zodSchema;// the original Zod schemactx.jsonSchema;// the default JSON Schema// directly modifyctx.jsonSchema.whatever='sup';},});
Обратите внимание, что непредставимые типы будут вызывать ошибку Error перед вызовом этой функции. Если вы пытаетесь определить пользовательское поведение для непредставимого типа, вам необходимо использовать настройку unrepresentable: "any" вместе с override.
1 2 3 4 5 6 7 8 91011
// support z.date() as ISO datetime stringsconstresult=z.toJSONSchema(z.date(),{unrepresentable:'any',override:(ctx)=>{constdef=ctx.zodSchema._zod.def;if(def.type==='date'){ctx.jsonSchema.type='string';ctx.jsonSchema.format='date-time';}},});
Некоторые типы схем имеют разные типы ввода и вывода, например ZodPipe, ZodDefault и принудительные примитивы. По умолчанию результат z.toJSONSchema представляет тип вывода; чтобы извлечь тип ввода, используйте "io": "input".
Передача схемы в z.toJSONSchema() вернет самостоятельную схему JSON.
В других случаях у вас может быть набор схем Zod, которые вы хотите представить с помощью нескольких взаимосвязанных схем JSON, например, для записи в файлы .json и обслуживания с веб-сервера.
По умолчанию URI $ref представляют собой простые относительные пути, такие как "User". Чтобы сделать эти URI абсолютными, используйте опцию uri. Для этого требуется функция, которая преобразует id в полный URI.