DevToolPal
繁

JSON 轉 Go 結構體

根據 JSON 範例產生帶 json 標籤的 Go 結構體,支援獨立命名或內嵌的巢狀結構體和 omitempty。

本機處理,不會上傳

選項

巢狀物件

JSON

0 字元 · 0 B

Go

0 字元 · 0 B

功能介紹

JSON 轉 Go 工具讀取一段 JSON 範例,產生帶 json 標籤的 Go 結構體定義,可以直接搭配 encoding/json 使用。貼上所呼叫 API 的回應資料,就能得到立即可以傳給 json.Unmarshal 的型別,不必手寫每個欄位和標籤。

轉換器會檢查範例中的每一個值。巢狀物件產生獨立的結構體,陣列的所有元素合併成一個元素型別,部分元素缺少或有時為 null 的欄位會被識別為可選。輸出依照 gofmt 的格式對齊。

使用方法

  1. 把 JSON 貼到輸入框、上傳 .json 檔案,或按「範例」。
  2. 設定根型別名稱,選擇巢狀物件的寫法、哪些欄位加 omitempty,以及可為空的欄位是否使用指標。
  3. 複製 Go 程式碼或下載為 .go 檔案,再加上 package 宣告。

JSON 格式錯誤時會提示出錯的行與欄。

範例

這段 JSON:

{ "id": 7, "user_name": "ada", "tags": ["admin"], "profile": { "avatar_url": "https://example.com/a.png" } }

會產生以下結構體:

type Root struct {
	ID       int      `json:"id"`
	UserName string   `json:"user_name"`
	Tags     []string `json:"tags"`
	Profile  Profile  `json:"profile"`
}

type Profile struct {
	AvatarURL string `json:"avatar_url"`
}

小提示

  • 一份範例只能呈現它包含的內容。如果某個值可能是數字也可能是字串,請兩種都提供,或把多份範例放進一個陣列讓它們合併。
  • 時間戳記以字串形式出現。若格式是 RFC 3339,可以自行把型別改成 time.Time。
  • 欄位完全相同的物件共用一個結構體,同樣的結構在多處出現時輸出也很精簡。
  • 還要寫 TypeScript?JSON 轉 TypeScript 工具使用相同的推斷邏輯產生介面。

常見問題

› 欄位名稱是怎麼產生的?

每個 JSON 鍵會轉換成 PascalCase 的匯出 Go 名稱,常見縮寫依 golint 的要求全大寫,所以 user_id 變成 UserID,avatar_url 變成 AvatarURL。原始鍵名保留在 json 標籤中,encoding/json 能準確對應欄位。

› 會使用哪些 Go 型別?

字串對應 string,整數對應 int(數值超出 32 位元時用 int64),小數對應 float64,布林值對應 bool。陣列變成 slice,空物件變成 map[string]any,只有 null 或混合多種型別的值變成 any。

› 獨立命名結構體和內嵌結構體有什麼差別?

命名模式把每個巢狀物件寫成獨立型別,例如 Address 或 Order,較方便重複使用和測試。內嵌模式把匿名結構體直接寫在父結構體中,所有內容都在同一個宣告裡,許多快速轉換工具採用這種寫法。

› 什麼時候加 omitempty?

預設只為可選欄位加上,也就是陣列中部分物件缺少或有時為 null 的欄位。也可以為所有欄位加上或全部不加。開啟指標選項,就能區分缺少、null 和零值。

› 我的 JSON 會被上傳嗎?

不會。結構體在瀏覽器中產生,不會傳送到伺服器。