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: falsez.strictObject()總是 設置additionalProperties: false
文件架構 (File schemas)
Zod 將 z.file() 轉換為以下 OpenAPI 友好的架構:
大小和 MIME 檢查也得到表示:
可空性 (Nullability)
Zod 在 JSON Schema 中將 z.null() 轉換為 { type: "null" }。
請注意,z.undefined() 在 JSON Schema 中是不可表示的(見 下文)。
同樣,nullable 通過與 null 的聯合表示:
可選架構按原樣表示,儘管它們帶有 optional 註釋。
配置 (Configuration)
第二個參數可用於自定義轉換邏輯。
下面是每個支持參數的快速參考。每個參數在下面都有更詳細的解釋。
target
要設置目標 JSON Schema 版本,請使用 target 參數。默認情況下,Zod 將針對 Draft 2020-12。
metadata
如果您還沒有,請通讀 元數據和註冊表 頁面以瞭解在 Zod 中存儲元數據的背景。
在 Zod 中,元數據存儲在註冊表中。Zod 導出一個全局註冊表 z.globalRegistry,可用於存儲常見的元數據字段,如 id、title、description 和 examples。
所有元數據字段都會被複製到生成的 JSON Schema 中。
unrepresentable
以下 APIs 在 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。如果您嘗試為不可表示的類型定義自定義行為,則需要將 unrepresentable: "any" 與 override 一起使用。
io
某些架構類型具有不同的輸入和輸出類型,例如 ZodPipe、ZodDefault 和強制原語。默認情況下,z.toJSONSchema 的結果表示 輸出類型;使用 "io": "input" 來提取輸入類型。
註冊表 (Registries)
將架構傳遞給 z.toJSONSchema() 將返回一個 自包含 的 JSON Schema。
在其他情況下,您可能有一組 Zod 架構,您希望使用多個相互鏈接的 JSON Schemas 來表示,也許是為了寫入 .json 文件並從 Web 服務器提供服務。
為了實現這一點,您可以將 註冊表 傳遞給 z.toJSONSchema()。
重要 — 所有架構都應該在註冊表中具有已註冊的 id 屬性!任何沒有 id 的架構都將被忽略。
默認情況下,$ref URIs 是像 "User" 這樣的簡單相對路徑。要使這些成為絕對 URIs,請使用 uri 選項。這需要一個將 id 轉換為完全限定 URI 的函數。

