ToolAct

JSON Schema 生成器

JSON 輸入
JSON Schema 輸出

配置選項說明

Schema ID
設定 Schema 的唯一標識符,通常使用 URI 格式,用於在大型系統中引用和識別 Schema
所有欄位必填
啟用後,所有屬性都會被加入到 required 陣列中,表示這些欄位在資料中必須存在
加入預設值
根據範例 JSON 中的實際值自動生成 default 屬性,適用於配置檔案等需要預設值的場景
加入欄位描述
自動為每個屬性加入 description 欄位,描述該欄位的資料類型和來源,便於文件生成
嚴格模式
啟用 additionalProperties: false,禁止出現 Schema 中未定義的額外屬性,確保資料結構嚴格一致

什麼是 JSON Schema?

JSON Schema 是一種用於描述和驗證 JSON 資料結構的規範。它定義了 JSON 文件應有的結構、資料類型、約束條件等規則,廣泛應用於 API 資料驗證、表單驗證、配置檔案校驗等場景。

通過 JSON Schema,您可以:

  • 資料驗證:驗證 JSON 資料是否符合預期的格式和約束
  • 文件生成:為 API 自動生成文件和類型定義
  • 程式碼提示:在 IDE 中獲得智能補全和類型檢查
  • 自動化測試:在測試中自動驗證回應資料格式

本工具支援 JSON Schema Draft-07 規範,能夠智能推斷巢狀物件、陣列類型、列舉值等複雜結構,幫助您快速建立標準化的 Schema 定義。

使用方式

使用方式

  1. 在左側輸入框中貼上 JSON 資料,或點選「範例」載入示範資料
  2. 設定選項:指定 Schema ID、選擇是否所有欄位皆為必填、新增預設值等
  3. 對應的 JSON Schema 定義會自動產生在右側
  4. 點選「複製」將產生的 Schema 複製到剪貼簿
  5. 將此 Schema 用於 API 驗證、表單驗證或設定檔檢查

Schema 提示

  • 產生的 Schema 反映您提供的 JSON 範例;複製前請確認範例涵蓋具代表性的選填欄位、null 值、陣列及邊界情境。
  • 請手動檢查必填欄位以及數值/字串格式;基於範例的推斷無法完全掌握您的業務規則。

使用場景

從真實 API 範例草擬 Schema貼上具代表性的 JSON 回應,產生一份 Draft-07 Schema,涵蓋物件屬性、基本型別、巢狀陣列、預設值和必填欄位。這給了前後端團隊一個具體的起點,再手動處理邊界情況。真實範例優於猜測,因為必填與可選、列舉成員都是從實際出現的資料中推斷出來的。
為設定檔建立文件說明對於內部設定範例,啟用預設值和描述欄位,產生一份在編輯器和文件中都實用的 Schema。嚴格模式可加上 additionalProperties: false,讓意外出現的欄位更容易被發現。搭配 CI 檢查,當設定檔不再符合契約時自動失敗。
在驗證工作前探索資料結構產生器會報告屬性數量並從範例元素推斷陣列型別,幫助你快速了解 payload 的大致輪廓。在有即時範例但尚未撰寫正式契約的第一輪 Schema 編寫中特別實用。結構對應完成後,可將 Schema 交給型別產生器產生更強型別的綁定。
用可為空和必填提示收緊推斷型別使用嚴格和可為 null 選項,讓產生的 Draft-07 Schema 正確標記可選欄位,而不是假設每個欄位都一定存在。請手動檢查產生的 required 陣列,因為缺少一個範例值就可能隱藏伺服器實際上必填的欄位。可為 null 的處理與 required 獨立開關,讓允許 null 但仍然必填的欄位能被準確建模。
區分 Draft-07 與 2020-12 版本以及列舉推斷本產生器預設輸出 JSON Schema Draft-07,目前仍是 Ajv、jsonschema 和表單函式庫支援最廣泛的版本;較新的專案可能想手動升級到 2020-12 以使用 if/then/else、prefixItems 或 const 關鍵字。列舉推斷是啟發式的:當字串欄位在範例中出現不超過約 10 個不同值時,會自動提升為 enum,因此請再次確認 status 等應保持自由格式的欄位。將產生的 Draft-07 Schema 視為起始草稿,再根據消費者函式庫的支援情況用轉換工具升級到 2020-12。

技術原理

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 不會離開您的瀏覽器。