跳至內容
Toova
所有工具

JSON 到 TypeScript、Go、Python、PHP、Rust

注重隱私的設計 — 完全在您的瀏覽器中執行

從真實 API 回應推斷正確的類型定義應該只需要五秒,但常常會吃掉十五分鐘。這個工具在你的瀏覽器內讀取 JSON 樣本,走過結構,並輸出 TypeScript、Go、Python、PHP 或 Rust 的慣用類型定義 — 包含可選欄位、ISO 日期偵測,以及正確的整數與浮點數區分。

推斷如何運作

工具走過 JSON 樹一次,建立中間表示:基本型別變成 string / int / float / bool / null,陣列從成員的聯集推斷元素型別,物件產生一個結構,其欄位型別來自值。當某個欄位出現在部分陣列元素而不在其他元素時,會被標記為可選 — 生成的類型可解析部分資料而不會崩潰。沒有小數部分的數字會輸出為 int64(Go)/ int(Python)/ i64(Rust),有小數部分的輸出為 float64 / float / f64。符合 ISO 8601(`2024-03-15T10:30:00Z`)的字串會變為 Date / time.Time / datetime / DateTimeInterface / chrono::DateTime。

各語言的輸出風格

每個輸出器遵循其目標語言的慣例。TypeScript:匯出 interface 使用 `?:` 語法。Go:struct 帶 `json:` 標籤,可選欄位用指標加 `omitempty`。Python:`@dataclass`,必填先、`Optional[T] = None` 後(dataclass 排序規則)。PHP:嚴格型別的 final 類別,陣列用 `@var list<T>` 的 phpdoc 標註。Rust:`#[derive(Serialize, Deserialize)]` struct,可為 null 用 `Option<T>`,當 Rust snake_case 名與 JSON 鍵不同時使用 `#[serde(rename)]`。

何時使用(以及何時不要)

這個生成器解決前 80% 的工作:從負載秒級得到可用的類型定義。當你需要精確約束時(字串的 regex、數值的 min/max、判別聯集),它不能取代手寫 schema。那些情況,把輸出當成起點,再收緊類型。可選欄位的偵測是啟發式的 — 基於樣本中的內容 — 所以可以的話請通過多個不同的樣本。

常見問題

我貼上的 JSON 會離開我的瀏覽器嗎?
不會。解析器、類型推斷和程式碼生成全部在你的分頁中以 JavaScript 執行。生成時打開網路面板 — 你會看到零個外送請求。安全用於含真實憑證與 PII 的生產負載。
為什麼我的欄位被標記為可選,儘管它總是有值?
可選標記只有在陣列包含有該欄位的物件與沒有該欄位的物件時才會觸發。如果你貼上單個物件,什麼都不會變成可選。如果你貼上相同物件的陣列,也不會。標記只在陣列內部結構有所變化時觸發。
整數與浮點數如何區分?
JSON 只有一種數字型別。工具檢查每個值,沒有小數部分時輸出 int(`42`、`1000`),有時輸出 float(`3.14`、`99.0`)。若一個陣列混合兩者,型別會擴展為 float 以避免有損解析。
能偵測 ISO 日期字串嗎?
可以。符合 `YYYY-MM-DD` 或 `YYYY-MM-DDTHH:MM:SS[.sss][Z|±HH:MM]` 的字串會輸出為語言原生的日期/時間型別(TS 的 Date、Go 的 time.Time、Python 的 datetime、PHP 的 DateTimeInterface、Rust 的 chrono::DateTime)。其他日期格式保持為 string。
使用生成的程式碼需要安裝什麼嗎?
TypeScript 輸出純粹 — 無依賴。Go 輸出僅使用標準函式庫(偵測到 ISO 日期時用 time.Time)。Python 輸出使用標準 dataclasses 模組。PHP 輸出使用原生型別。Rust 輸出在出現 ISO 日期時需要 serde + chrono。標頭/匯入會在合適位置寫入輸出。
可以為根為物件陣列的 JSON 生成類型嗎?
可以。如果根值是物件陣列,工具會為元素輸出一個 struct,並為陣列輸出一個頂層類型別名。例如,名為 `Users` 的 JSON `[{...}, {...}]` 會產生 `User` 介面以及 `type Users = User[];`(TypeScript)或 `pub type Users = Vec<User>;`(Rust)。