JSON 轉 Go 結構體轉換器
貼上一個 JSON 物件(或 JSON 陣列),自動生成對應的 Go struct 定義及 json 標籤。
使用小貼士
- 當陣列的所有元素都是物件時,會合並各元素的鍵生成一個 struct。僅存在於部分元素中的鍵會自動加上 `omitempty` 標籤。
- 根型別名稱預設是 "Root",可以改成你喜歡的名字。巢狀物件的 struct 名稱會根據屬性名自動轉換為 PascalCase 生成。
- 由於 Go 沒有原生的可空基本型別,JSON 的 null 會被轉換為 `interface{}`。如需更嚴格的處理,可以考慮改用指標型別。
- 生成結果只是簡單對齊列寬的草稿,粘貼後通過 `gofmt` 處理即可對齊到專案的標準風格。
- 直接貼上 API 響應的示例 JSON,即可快速得到 Go 中響應結構體的初稿。
常見問題
手工從示例響應編寫 struct 既耗時又容易出錯,尤其在巢狀層級較深時,容易寫錯欄位名轉換或漏寫 json 標籤。自動生成可以避免這些錯誤,大幅縮短開發時間。
JSON 鍵(snake_case 或 camelCase)會被轉換為首字母大寫的 PascalCase,成為 Go 中可匯出的欄位名。原始的 JSON 鍵會原樣保留在 json 標籤(`json:"原始鍵"`)中,因此編碼解碼不受影響。
null 值會被輸出為 `interface{}` 型別。僅在陣列部分元素中出現的鍵會自動帶上 `omitempty` 標籤,但 Go 型別本身只會取零值,如需區分"缺失"與"零值",可以考慮改用指標型別。
含有小數點的 JSON 數值會被判斷為 `float64`,不含小數點的則判斷為 `int`。由於 JSON 的數值表示只保留位數資訊,對於需要 `int64` 的超大數值,請生成後手動調整。
由於 Go 沒有聯合型別,同一個鍵在不同元素中型別不一致時會回退為 `interface{}`,需要在執行時用型別斷言來判斷實際的值型別。
閒話 ― Go 中 struct 與 json 標籤的設計
Go 是一門靜態型別語言,在處理 JSON 時,標準庫的 `encoding/json` 包依賴 struct 欄位與 json 標籤之間的對應關係來完成編碼和解碼。手工為外部 API 的響應結構編寫 struct 是一項隨著欄位增多而愈發繁瑣的重複勞動,這在許多 Go 專案中反覆出現。
這款工具通過解析示例 JSON 的結構,自動生成對應的 struct 定義和 json 標籤,從而減輕這類重複工作。同類工具中,支援轉換為多種語言型別的 quicktype 頗為知名;但如果只是想貼上一份示例 API 響應、快速得到一個 Go struct,專注單一功能的工具也自有其便利之處。
由於 Go 沒有讓 struct 欄位變為"可選"的語言特性,對於 JSON 中可能缺失的欄位,常見做法是在 json 標籤中加上 `omitempty`,或改用指標型別(如 `*string`)來區分零值與"值不存在"。生成的 struct 終究只是根據結構做出的機械推斷,將可空性判斷和 API 未來變化納入設計,應當對照實際的介面文件手動調整,這是實踐中的通行做法。