JSON Schema
新機能 — Zod 4 は、ネイティブの JSON Schema 変換という新機能を導入しました。JSON Schema は、JSON の構造(JSON を使用)を記述するための標準です。OpenAPI 定義や AI の 構造化出力 の定義で広く使用されています。
Zod スキーマを JSON Schema に変換するには、z.toJSONSchema() 関数を使用します。
すべてのスキーマとチェックは、最も近い JSON Schema の同等物に変換されます。一部のタイプには類似物がなく、合理的に表現できません。これらのケースの処理の詳細については、以下の unrepresentable セクションを参照してください。
文字列フォーマット (String formats)
Zod は、次のスキーマタイプを同等の JSON Schema format に変換します。
これらのスキーマは contentEncoding を介してサポートされています。
他のすべての文字列フォーマットは pattern を介してサポートされています。
数値型 (Numeric types)
Zod は、次の数値型を JSON Schema に変換します。
オブジェクトスキーマ (Object schemas)
デフォルトでは、z.object() スキーマには additionalProperties: "false" が含まれています。これは Zod のデフォルト動作の正確な表現であり、プレーンな z.object() スキーマは追加のプロパティを取り除くためです。
"input" モードで JSON Schema に変換する場合、additionalProperties は設定されません。詳細については、io ドキュメント を参照してください。
対照的に:
z.looseObject()は 決してadditionalProperties: falseを設定しませんz.strictObject()は 常にadditionalProperties: falseを設定します
ファイルスキーマ (File schemas)
Zod は z.file() を次の OpenAPI フレンドリーなスキーマに変換します。
サイズと MIME のチェックも表現されます。
ヌル可能性 (Nullability)
Zod は z.null() を JSON Schema での { type: "null" } に変換します。
z.undefined() は JSON Schema では表現できないことに注意してください(下記 を参照)。
同様に、nullable は null との和集合を介して表現されます。
オプションのスキーマはそのまま表現されますが、optional アノテーションで装飾されます。
設定 (Configuration)
2番目の引数を使用して、変換ロジックをカスタマイズできます。
以下は、サポートされている各パラメータのクイックリファレンスです。それぞれについては、以下で詳しく説明します。
target
ターゲットの JSON Schema バージョンを設定するには、target パラメータを使用します。デフォルトでは、Zod は Draft 2020-12 をターゲットにします。
metadata
まだ読んでいない場合は、Zod でのメタデータの保存に関するコンテキストについて メタデータとレジストリ ページを参照してください。
Zod では、メタデータはレジストリに保存されます。Zod は、id、title、description、examples などの一般的なメタデータフィールドを保存するために使用できるグローバルレジストリ z.globalRegistry をエクスポートします。
すべてのメタデータフィールドは、生成される JSON Schema にコピーされます。
unrepresentable
次の API は JSON Schema では表現できません。デフォルトでは、Zod はこれらに遭遇するとエラーをスローします。JSON Schema への変換を試みるのは不健全です。JSON には同等のものがないため、スキーマを変更する必要があります。これらに遭遇するとエラーがスローされます。
デフォルトでは、Zod はこれらに遭遇するとエラーをスローします。
unrepresentable オプションを "any" に設定することで、この動作を変更できます。これにより、表現不可能なタイプは {}(JSON Schema の unknown に相当)に変換されます。
cycles
循環の処理方法。z.toJSONSchema() がスキーマをトラバースする際に循環が検出された場合、$ref を使用して表現されます。
代わりにエラーをスローしたい場合は、cycles オプションを "throw" に設定します。
reused
同じスキーマ内で複数回発生するスキーマの処理方法。デフォルトでは、Zod はこれらのスキーマをインライン化します。
代わりに reused オプションを "ref" に設定して、これらのスキーマを $defs に抽出することができます。
override
いくつかのカスタムオーバーライドロジックを定義するには、override を使用します。提供されるコールバックは、元の Zod スキーマとデフォルトの JSON Schema にアクセスできます。この関数は ctx.jsonSchema を直接変更する必要があります。
表現不可能なタイプは、この関数が呼び出される前に Error をスローすることに注意してください。表現不可能なタイプのカスタム動作を定義しようとしている場合は、override と一緒に unrepresentable: "any" を設定する必要があります。
io
ZodPipe、ZodDefault、型変換されたプリミティブなど、一部のスキーマタイプは異なる入力タイプと出力タイプを持っています。デフォルトでは、z.toJSONSchema の結果は 出力タイプ を表します。代わりに入力タイプを抽出するには "io": "input" を使用します。
レジストリ (Registries)
スキーマを z.toJSONSchema() に渡すと、自己完結型 の JSON Schema が返されます。
その他のケースとして、複数の相互リンクされた JSON Schema を使用して表現したい Zod スキーマのセットがあり、おそらく .json ファイルに書き込んで Web サーバーから提供する場合などがあります。
これを実現するには、レジストリ を z.toJSONSchema() に渡すことができます。
重要 — すべてのスキーマは、レジストリに登録された id プロパティを持っている必要があります! id のないスキーマは無視されます。
デフォルトでは、$ref URI は "User" のような単純な相対パスです。これらを絶対 URI にするには、uri オプションを使用します。これは、id を完全修飾 URI に変換する関数を想定しています。

