JSON Schema 生成器
根據 JSON 資料自動生成符合規範的 JSON Schema 定義
// 輸入 JSON 後自動生成 JSON Schema什麼是 JSON Schema?
JSON Schema 是一種用於描述和驗證 JSON 資料結構的規範。它定義了 JSON 文件應有的結構、資料類型、約束條件等規則,廣泛應用於 API 資料驗證、表單驗證、配置檔案校驗等場景。
通過 JSON Schema,您可以:
- 資料驗證:驗證 JSON 資料是否符合預期的格式和約束
- 文件生成:為 API 自動生成文件和類型定義
- 程式碼提示:在 IDE 中獲得智能補全和類型檢查
- 自動化測試:在測試中自動驗證回應資料格式
本工具支援 JSON Schema Draft-07 規範,能夠智能推斷巢狀物件、陣列類型、列舉值等複雜結構,幫助您快速建立標準化的 Schema 定義。
使用方式
使用方式
- 在左側輸入框中貼上 JSON 資料,或點選「範例」載入示範資料
- 設定選項:指定 Schema ID、選擇是否所有欄位皆為必填、新增預設值等
- 對應的 JSON Schema 定義會自動產生在右側
- 點選「複製」將產生的 Schema 複製到剪貼簿
- 將此 Schema 用於 API 驗證、表單驗證或設定檔檢查
Schema 提示
- 產生的 Schema 反映您提供的 JSON 範例;複製前請確認範例涵蓋具代表性的選填欄位、null 值、陣列及邊界情境。
- 請手動檢查必填欄位以及數值/字串格式;基於範例的推斷無法完全掌握您的業務規則。
使用場景
技術原理
JSON Schema 是一套用於標註和驗證 JSON 文件的宣告式詞彙,定義在多個 IETF 草案中(Draft 4 / 6 / 7 / 2019-09 / 2020-12)。最新版本是 Draft 2020-12,定義了七種原始型別(string、number、integer、boolean、array、object、null)、一個開放式格式詞彙(email、uri、date-time、uuid、ipv4、hostname 等),以及數十個約束關鍵字:pattern(正則表達式)、minimum/maximum/exclusiveMinimum/exclusiveMaximum(數值範圍)、minLength/maxLength(字串長度)、minItems/maxItems/uniqueItems(陣列約束)、required(物件層級的必填陣列)、additionalProperties(是否允許額外欄位)、enum 和 const(允許的值)以及 $ref(子結構重用)。本頁面預設產生 Draft 2020-12 輸出,也可從下拉選單選擇較舊的 Draft-07(目前在正式環境結構中仍最常見)。 產生器的推斷是對使用者提供的 JSON 進行單次遍歷,遞迴建構結構物件。推斷核心的對應規則為:整數(Number.isInteger 且無小數部分)-> {type: 'integer'},浮點數 -> {type: 'number'},字串 -> {type: 'string'},布林值 -> {type: 'boolean'},陣列 -> {type: 'array', items: <對第一個元素遞迴>} 或 Draft 2020-12 的元組 {type: 'array', prefixItems: [...]},物件 -> {type: 'object', properties: <對每個鍵遞迴>},null -> {type: 'null'}。對於混合元素型別的陣列,產生器發出 oneOf 子結構涵蓋每個觀察到的型別。 對於多個範例物件,產生器進行比對以組裝 required 清單:出現在每個範例中的鍵為必填,任何範例遺漏的鍵為可選。當範例聚集時會推斷模式和約束:若某欄位的所有數字落在 [1, 100] 範圍內,產生器發出 {type: 'integer', minimum: 1, maximum: 100};若某字串欄位始終為 UUID,產生器以 format: 'uuid' 標記並發出 pattern: '^[0-9a-f]{8}-...' 正則表達式。列舉啟發式在字串欄位於範例中出現不超過約 10 個不同值時觸發(例如 role: 'admin' | 'editor' | 'viewer' 全部被觀察到),此時產生器發出 enum 陣列。 深度巢狀物件和遞迴結構會被提取到 $defs 區段(Draft 2020-12;較舊的 $definitions 是 Draft-07 關鍵字),並透過 $ref 引用。遞迴結構——例如具有 'children' 欄位且型別為同一樹節點的樹節點——會獲得指向父級 $defs 條目的 $ref 樁,驗證器在驗證時解析它。產生器自動選擇合適的 ref 與內聯權衡:淺層結構保持內聯,深層結構拆分為定義以保持輸出可讀性。產生的結構對給定輸入是確定性的:相同的 JSON 範例始終產生相同的結構,產生器以純 JavaScript 實現,無遠端呼叫。
- 型別推斷規則:整數 -> integer,浮點數 -> number,字串 -> string,布林值 -> boolean,陣列 -> array + items,物件 -> object + properties。JSON null -> type: null(Draft 6+)或 type: 'null' 字串。
- 必填欄位偵測:比對所有範例物件,存在於每個物件中的欄位視為必填並加入 required 陣列;遺漏的為可選。單範例輸入產生 required: [],因為啟發式至少需要兩個範例。
- 列舉推斷啟發式:當某欄位在範例中取少量有限的不同字串值(基數 <= 10)時,自動識別為 enum 約束。較大的基數保持為純 string 型別。
- 自動偵測格式:根據字串特徵,欄位被標記為 email、uri、date-time、uuid 等格式提示,用於文件和驗證。format 關鍵字在 Draft 2020-12 中是資訊性的——驗證器可選擇強制執行或忽略。
- 巢狀 $ref 提取:深度巢狀物件被提取到內部 $defs(Draft 2020-12 關鍵字;較舊的 $definitions 來自 Draft 7)並透過 $ref 引用,避免結構過於冗長。遞迴結構獲得指向父級 $defs 條目的 $ref 樁。
- 約束擴展:除基本型別外,還可新增 minimum/maximum(數值範圍)、minLength/maxLength(字串長度)、pattern(正則表達式)等約束。當輸入範例聚集在特定值時,產生器會發出這些約束。
- 版本選擇:2020-12(最新版)為預設,使用 $defs;2019-09 也使用 $defs;Draft-07 使用 $definitions,是大多數現有工具仍輸出的版本。Draft 6 引入了嚴格的 required 語意,必填欄位列在父級的 required 陣列中而非作為同級屬性。
- 組合關鍵字(Draft 2019-09+):allOf(必須符合所有子結構)、anyOf(至少符合一個)、oneOf(恰好符合一個)、not(不得符合)。當範例值符合兩個互斥的子結構(例如 integer 與 string)時,產生器選擇 oneOf。
範例
簡單物件 -> Schema
{"name": "Alice", "age": 25}
->
{
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "integer" }
},
"required": ["name", "age"]
}包含陣列的 Schema
{"tags": ["js", "ts"]}
->
{
"type": "object",
"properties": {
"tags": {
"type": "array",
"items": { "type": "string" }
}
}
}包含 Enum 的 Schema
{"role": "admin"}
->
{
"type": "object",
"properties": {
"role": { "type": "string", "enum": ["admin", "user", "guest"] }
}
}常見問題
什麼是 JSON Schema?
JSON Schema(目前為 2020-12 草案)是一套用來驗證 JSON 文件的詞彙表。它描述文件預期的結構——哪些欄位存在、各自的型別、範圍與樣式——類似於 XML Schema 或 TypeScript 型別。Ajv、Hyperjump 以及大多數 API 框架都會在執行時用它做驗證。
產生器輸出哪一版的 JSON Schema 草案?
現代草案(通常是 2020-12 或 draft-07)。輸出會以 $schema 宣告版本、視情況加入 $id、type,以及對應物件、陣列、字串、數字、布林、null 的相關關鍵字。如果您的驗證器需要特定的舊版本,請切換 draft 選項。
它如何從 JSON 範例推斷型別?
它會走訪整份範例,記錄每個屬性的型別。對於陣列,會根據一個或多個元素推斷 items 結構(若元素型別不同則取聯集)。混合型別屬性會使用 oneOf 或 anyOf。結果會是一份較寬鬆的起始 schema;想加嚴限制(required、minLength、pattern)需要手動處理。
所有屬性都會被標記為必填嗎?
可設定。預設會把每個觀察到的屬性都標為必填。如果您的範例只是單一例子、其他實例可能合理地省略某些欄位,可切換成「全部選填」。產生後您也可以手動編輯 required 陣列。
巢狀物件與陣列如何處理?
巢狀物件會變成巢狀的 properties 區塊;陣列則會變成 items 定義。深層巢狀也能正確處理。如果同一種結構多次出現,您可以在事後用 $defs / $ref 重構——產生器不會自動去重。
有哪些內容它推斷不出來?
格式約束(date-time、email、uuid)、列舉成員、正規表示式樣式、minimum/maximum、minItems/maxItems 以及相依性,都需要手動補上,因為單一範例展示不出這些資訊。請把產生的 schema 當作骨架,再逐步加嚴。
我的 JSON 會被上傳嗎?
不會。型別推斷在本機進行。貼上的 JSON 不會離開您的瀏覽器。