跳到主要內容

JSON 轉 TypeScript、Go、Python 等型別

貼上 JSON 範例,就能產生 TypeScript 介面、Zod 結構描述、Go struct,以及 Python、Java、C#、Kotlin、Swift 和 Rust 型別,全部在瀏覽器中完成。

多份範例(依序排列或 JSON Lines 格式)以及陣列內的物件會合併處理:在某處缺少的鍵會變成選填,null 值則會變成可為 null。

TypeScript
貼上範例後,按下「產生型別」。
宣告方式
在瀏覽器中執行・不需上傳運作方式

JSON 轉型別 使用方法

  1. 1

    貼上 JSON 範例

    貼上一份回應、一個記錄陣列,或連續貼上多份回應;範例會示範合併兩位使用者的資料。

  2. 2

    選擇語言

    選擇 TypeScript、Zod、Go、Python、Java、C#、Kotlin、Swift 或 Rust,並設定該語言的風格選項。

  3. 3

    為根型別命名

    設定最上層型別的名稱,例如 User 或 OrderResponse。

  4. 4

    產生並複製

    按下「產生型別」,然後複製程式碼或下載;修改設定後會自動重新產生。

限制與 Pro

免費且不需註冊:支援 9 種輸出語言與 3 種 Python 風格,可合併任意數量的範例,檔案上限 20 MB,產生時間超過 30 秒會停止。

Pro 方案可移除廣告,產生器的功能在所有方案中都相同。 查看 Pro

關於 JSON 轉型別

手寫 API 回應的型別既費時又容易出錯,尤其是資料巢狀三層以上時。貼上一份或多份 JSON 範例,這個產生器就會推斷結構,並輸出可直接貼上的定義,共支援九種格式:TypeScript interface 或 type alias、搭配 Zod 做執行階段驗證的 TypeScript、含 json tag 的 Go struct、Python dataclass、TypedDict 或 Pydantic v2 模型、使用 Jackson 註解的 Java record、適用 System.Text.Json 的 C# 類別、適用 kotlinx.serialization 的 Kotlin data class、Swift Codable struct,以及適用 serde 的 Rust struct。

單一範例很難涵蓋所有欄位,所以產生器會合併你提供的所有範例。你可以連續貼上多份文件、使用 JSON Lines,或貼上物件陣列:只在部分物件中出現的鍵會變成選填,有時為 null 的鍵會變成可為 null,有時是小數的整數會變成浮點數,真正混合的值則會變成聯集或該語言的動態 JSON 型別。巢狀物件會有各自命名的型別,例如 orders 變成 Order、addresses 變成 Address,相同結構只會產生一次並重複使用。鍵為數字、UUID 或日期的物件會轉成 map。

欄位名稱會依各語言慣例轉換,像 first-name 或 class 這類不同的 JSON 鍵,則會以適當的註解、別名或 CodingKeys 對應回原名。範例中的註解與結尾逗號也能容許。

輸出內容只描述你提供的範例,產生器無法得知範例之外的欄位或值,因此正式採用前,請對照你的 API 文件檢查。

隱私

範例的解析與程式碼的產生,都由這個分頁中的 Web Worker 完成,所以含有個人或內部資料的 API 回應不會被上傳。語言與命名選項會儲存在本機儲存空間,你貼上的 JSON 則不會保留。

功能

合併多份範例

在你貼上的所有範例中,缺少的鍵會變成選填,null 值會變成可為 null。

支援 9 種語言

TypeScript、Zod、Go、Python、Java、C#、Kotlin、Swift 與 Rust,命名符合各語言慣例。

內建鍵名對應

json tag、別名、@SerialName、@JsonProperty 與 CodingKeys 會保留原本的 JSON 名稱。

JSON 轉型別:常見問題

它如何判斷哪些欄位是選填?
只要同一位置的物件中,至少有一個不含該鍵,這個欄位就是選填。如果只貼上單一物件,所有欄位都會視為必填,因為沒有任何跡象顯示並非如此。請貼上多份真實回應或記錄陣列,讓產生器看出哪些鍵有時會缺少。「將所有欄位設為選填」則適用於部分更新或 patch 的資料。
值有時是 null 時會怎麼處理?
該欄位會變成可為 null:TypeScript 為 string | null,Go 為指標,Python 為 str | None,Kotlin 與 Swift 為 String?,Rust 為 Option<String>,Java 與 C# 則是包裝型別或可為 null 的型別。若某欄位在所有範例中都是 null,就無從推斷型別,會改用該語言的未知或動態 JSON 型別。
為什麼我的整數變成了浮點數?
如果同一個欄位在某份範例中是 7,在另一份是 7.5,型別就必須同時容納兩者,因此會變成 float 或 double。寫成帶小數點的數字,例如 10.0,也會視為小數。在 TypeScript 中兩者都是 number;使用 Zod 時,只含整數的欄位會以 z.number().int() 檢查。
這和 quicktype 一樣嗎?
它要解決的問題相同,但使用自己的產生器,完全在瀏覽器中執行,還多了幾項功能:包含 TypedDict 在內的三種 Python 風格、Zod 結構描述,以及合併多份貼上的文件。quicktype 支援更多語言,也能讀取 JSON Schema。對這裡的九種語言,輸出的程式碼設計成不需額外的執行階段輔助工具就能編譯。
它能偵測日期、列舉或 UUID 嗎?
不能。字串一律維持為字串,因為少數幾份範例無法證明未來每個值都是日期或固定集合中的值。若你的 API 能保證,請手動把產生的型別改成 Date、time.Time、datetime、列舉或 UUID 型別。唯一的例外是以 UUID、數字或日期為鍵的物件,它們會轉成 map。