相關推薦
關於 JSON 轉 Go:把 JSON 變成 Go 的強類型 struct
JSON 轉 Go 是把 JSON 格式的資料自動轉換為 Go 語言 struct 類型定義的過程。JSON 是 REST API、設定檔、訊息佇列和日誌中最常見的資料交換格式,而 Go 是一門強類型語言,開發中經常需要把 JSON 的動態結構映射為 struct 才能用 encoding/json 進行反序列化。手寫 struct 尤其是巢狀物件時容易漏欄位或寫錯類型,這個工具就是要把重複勞動自動化。
Go 的 struct 是複合資料類型,用 `type Name struct { ... }` 宣告。每個欄位由名稱和類型組成,欄位名必須大寫開頭才能被其他套件存取,也就是所謂「可匯出識別符」。工具會自動把 JSON 的欄位名轉為 PascalCase 的匯出欄位名,例如 `user_name` 會映射為 `UserName`,並保留原始 key 在 json 標籤中。
本工具的核心轉換由瀏覽器內的 jsonFormat Web Worker 完成,呼叫 quicktype-core 的 Go 渲染器並傳入 `just-types` 與 `no-comments` 選項。整個流程不依賴後端服務:輸入的 JSON 在本機解析、推斷類型、生成 Go 程式碼,最後呈現到右側編輯器中。
類型推斷遵循 JSON 到 Go 的常規映射:字串映射為 `string`、布林映射為 `bool`、整數映射為 `int64`、浮點數映射為 `float64`、陣列映射為切片 `[]T`、物件映射為獨立的 struct、`null` 映射為 `interface{}`。巢狀物件會遞迴處理,保持層級關係清晰。
與手動編寫相比,工具生成的程式碼是一份「可執行的初稿」。開發者通常只需要微調根類型名、套件名、欄位類型精度(如 int64 改 int)以及是否使用指標類型,就可以放進真正的 Go 專案中。配合一鍵複製和 model.go 下載,可以顯著減少聯調和建模階段的重複工作。
適用場景
- Go 後端開發把 REST API 回應 JSON 轉成 struct,直接用 json.Unmarshal 綁定到 Gin/Echo/Fiber handler 的入參
- 前後端聯調時拿到 Postman 裡的範例回應 JSON,快速生成 Go model 減少手寫欄位
- 對接第三方 Webhook 回呼時,把 payload JSON 轉成 Go struct 方便欄位級存取與校驗
- 把 Viper/Consul/Nacos 裡的 JSON 設定檔轉成 Go 類型,替代 map[string]interface{} 的弱類型存取
- 微服務團隊統一定義 gRPC/HTTP 介面的請求回應結構,把範例 JSON 轉成共享的 Go 類型
- 測試工程師把 JSON fixture 轉成 Go struct,配合 testify 做斷言驅動測試
- 維運人員解析 ELK/Fluentd 收集的 JSON 日誌行,生成 struct 後用 Go 程式做結構化分析
- 爬蟲抓取到 JSON 資料後轉成 Go struct,配合 gorm/gen 或 ent 生成資料庫模型
- IoT 裝置上報的 JSON 遙測資料轉成 Go struct,在邊緣閘道程式中做反序列化與過濾
- 把 Kafka/NATS/RabbitMQ 消費的 JSON 訊息轉成 Go 類型,用於事件驅動的消費者實現
- SDK 開發者把服務端範例回應 JSON 轉成 Go struct,寫入 client 庫的 types 套件供使用者引用
- 把 Swagger/OpenAPI 文件中的範例 JSON 轉成 Go struct,作為介面文件程式碼範例
- 學生或講師在 Go 課程中把範例 JSON 轉成 struct,示範 Go 的類型系統與 json 標籤用法
- 資料移轉指令碼把 MySQL/PostgreSQL 匯出的 JSON 行轉成 Go struct,做欄位映射與類型校驗
- CI/CD 設定 JSON 轉 Go struct,方便在 Go 編寫的流水線工具裡強類型讀取設定
- 老專案中把基於 map 動態讀取的 JSON 程式碼重構為基於 struct 的強類型存取
使用方法
- 在左側編輯器貼上 JSON 內容,或拖曳上傳 .json/.txt 檔案,也可以點擊「範例」載入內建資料。
- 等待約 400ms,工具會自動轉換並在右側顯示生成的 Go struct 程式碼。
- 如果 JSON 報錯,點擊「修復 JSON」按鈕自動修正常見格式錯誤後繼續生成。
- 檢查右側輸出,點擊「複製」貼到 Go 專案,或點擊「下載」儲存為 model.go 檔案。
功能特點
- 瀏覽器本機生成 Go struct:JSON 解析與 Go 程式碼生成在瀏覽器內完成,原始資料不上傳伺服器
- 400ms 防抖自動轉換:貼上或修改後無需手動點擊,右側即時輸出可複製的 Go 程式碼
- 智慧型別推斷:字串映射為 string、布林映射為 bool、整數映射為 int64、浮點映射為 float64、陣列映射為切片、物件映射為 struct
- 巢狀物件自動展開:遞迴生成獨立 struct 類型,保持 JSON 層級關係清晰
- 自動生成 json 標籤:欄位後附帶 `json:"原始欄位名"` 標籤,可直接配合 encoding/json 使用
- JSON 錯誤一鍵修復:自動處理尾隨逗號、單引號、缺引號等常見格式錯誤,修復後繼續生成
- 支援貼上/上傳/範例三種輸入:可拖曳上傳 .json/.txt 檔案,或載入內建中文範例
- 一鍵複製與下載:複製整段 Go 程式碼到剪貼簿,或下載為 model.go 檔案直接放入專案
- localStorage 輸入歷史:自動儲存最近輸入,重新整理或誤關頁面後可快速恢復
- 響應式分屏編輯器:左右面板寬度可調,桌面和移動端都能舒適檢視輸入與輸出
程式碼範例
用生成的 struct 反序列化 JSON
go把工具生成的 struct 複製到專案後,可直接用 encoding/json 反序列化 API 回應。
package main
import (
"encoding/json"
"fmt"
)
// 以下代码由 GeekFormat JSON 转 Go 工具生成
type User struct {
ID int64 `json:"id"`
Name string `json:"name"`
Tags []string `json:"tags"`
Address Address `json:"address"`
}
type Address struct {
City string `json:"city"`
}
func main() {
data := []byte(`{
"id": 1,
"name": "Alice",
"tags": ["admin", "dev"],
"address": {"city": "Beijing"}
}`)
var u User
if err := json.Unmarshal(data, &u); err != nil {
panic(err)
}
fmt.Println(u.Name, u.Address.City)
}處理欄位可能缺失的 JSON
go如果 API 某些欄位可能不存在,可把對應欄位改為指標類型或配合 omitempty 標籤使用。
package main
import "encoding/json"
// 手动将字段改为指针,缺失时值为 nil
type User struct {
ID *int64 `json:"id,omitempty"`
Name *string `json:"name,omitempty"`
Email *string `json:"email,omitempty"`
}
func main() {
data := []byte(`{"id": 1, "name": "Bob"}`)
var u User
json.Unmarshal(data, &u)
if u.Email == nil {
println("Email 字段缺失")
}
}常見問題
怎麼把 JSON 轉成 Go struct?
將 JSON 內容貼到左側輸入框,工具會在 400ms 內自動轉換並在右側顯示生成的 Go struct。也可以拖曳上傳 .json/.txt 檔案,或點擊「範例」載入內建資料。轉換完成後可一鍵複製或下載 model.go 檔案。
生成的 Go 程式碼包含 json 標籤嗎?
包含。工具基於 quicktype-core 生成 Go 程式碼,預設會為每個 struct 欄位附帶 `json:"原始欄位名"` 標籤,方便直接用 encoding/json 的 Unmarshal/Marshal 進行序列化與反序列化。
JSON 陣列會轉成 Go 切片嗎?
會。JSON 陣列會根據元素類型生成對應的切片類型,例如 `["a","b"]` 生成 `[]string`,`[1,2,3]` 生成 `[]int64`,`[{...},{...}]` 生成 `[]UserItem` 等自訂類型。
巢狀物件會生成多個 struct 嗎?
會。每個巢狀物件都會遞迴生成獨立的 struct 類型,命名採用 PascalCase。例如 `address` 物件會生成 `Address` struct,主 struct 中透過 `Address Address` 欄位引用。
null 值會生成什麼類型?
JSON 中的 null 值通常會被推斷為 `interface{}`,這是安全兜底類型。如果你已知該欄位實際類型,可在 JSON 中補充一個範例值後重新生成,先手動調整為具體類型。
可以自訂根 struct 的名稱嗎?
可以。工具預設使用根類型名(如 User),在設定中修改根類型名後,所有關聯的子類型命名會同步更新,下載的檔名也會隨之改變。
JSON 格式錯誤怎麼辦?
工具會自動偵測 JSON 合法性,如果存在尾隨逗號、單引號、缺引號等常見錯誤,會顯示「修復 JSON」按鈕。點擊後工具會嘗試自動修復並重新生成 Go struct;無法修復時會給出具體錯誤位置。
資料會上傳到伺服器嗎?隱私安全嗎?
不會。所有 JSON 解析、類型推斷和 Go 程式碼生成都在你的瀏覽器內透過 Web Worker 完成,輸入內容和生成的程式碼不會上傳到任何伺服器,也不會被記錄到雲端。包含 API 金鑰、token 或業務資料的敏感 JSON 也可以放心使用。
生成的程式碼可以直接放到 Go 專案裡用嗎?
可以。生成的程式碼是標準 Go struct,帶有 json 標籤,可直接複製到專案的 types/ 或 models/ 目錄下使用。建議根據專案命名規範微調類型名和套件名。
這個工具收費嗎?需要註冊嗎?
完全免費,無需註冊或登入。打開頁面即可使用,沒有任何功能限制、浮水印或強制登入。
支援多大的 JSON 檔案?
工具沒有嚴格的檔案大小限制,但轉換速度和渲染效能取決於瀏覽器與裝置效能。建議處理 1MB 以內的 JSON 以獲得最佳體驗;超大 JSON 可先透過 JSON 格式化或拆分工具處理。
數字類型會統一生成 float64 嗎?
不會。工具會區分整數和浮點數:整數欄位生成 int64,浮點數欄位生成 float64。如果希望使用 int、uint64 等更具體的類型,可在生成後手動替換。
故障排查
右側提示「請輸入 JSON 資料」
左側輸入框為空或只有空白字元。請貼上有效 JSON,或點擊「範例」載入資料,或拖曳上傳 .json/.txt 檔案。
提示 JSON 解析失敗但找不到錯誤位置
點擊輸入框下方的「修復 JSON」按鈕,工具會自動嘗試修復尾隨逗號、單引號、缺引號、JS 風格物件等問題。修復後會高亮顯示修改後的結果。
生成的欄位名不符合 Go 命名規範
工具會按 JSON key 生成 PascalCase 欄位名。如果 key 包含中文或特殊字元,可能會生成轉義後的欄位名。建議把 JSON key 改為英文小寫或 snake_case,生成後再統一調整。
null 欄位生成了 interface{},想改成具體類型
由於 null 無法推斷具體類型,工具用 interface{} 兜底。你可以在源 JSON 中給該欄位一個範例值(如 "" 或 0),重新生成後把類型改成 string/int64 等實際類型。
大 JSON 轉換後頁面卡頓
瀏覽器渲染超大 JSON 和大量 struct 會消耗較多記憶體。建議:① 只保留關鍵欄位的範例 JSON;② 拆分成多個物件分別轉換;③ 關閉頁面其他佔用記憶體的標籤。
陣列元素類型推斷為 []interface{}
當陣列為空 [] 或元素類型不一致時,工具會用 interface{} 兜底。可補充同類型範例元素,或在生成後手動把類型改為 []string、[]int64 等具體切片類型。
術語表
- struct
- Go 的複合資料類型,用於把多個欄位組合成一個類型。本工具生成的 Go 程式碼主體就是若干 struct 定義。
- slice
- Go 的動態陣列類型,語法為 []T。本工具會把 JSON 陣列映射為對應的 slice,例如 []string、[]int64、[]UserItem。
- json tag
- Go struct 欄位後的反引號字串,如 `json:"user_name"`,用於指定 encoding/json 序列化/反序列化時的欄位名。本工具會自動生成該標籤。
- interface{}
- Go 的空介面類型,可以表示任意值。本工具在遇到 JSON null 或類型無法確定時,會用 interface{} 作為安全兜底。
- PascalCase
- 每個單字首字母大寫的命名風格,如 UserName、AddressCity。Go 要求可匯出欄位必須以大寫字母開頭,因此本工具會自動把 JSON 欄位名轉為 PascalCase。
- encoding/json
- Go 標準庫中的 JSON 編解碼套件。本工具生成的 struct 配合 json 標籤後,可直接用 json.Unmarshal 和 json.Marshal 處理。
- unmarshal
- 把 JSON 位元組流解析為 Go 值的過程。生成 struct 後,最常見的用法就是呼叫 json.Unmarshal(data, &user)。
- omitempty
- Go json tag 的常用選項,如 `json:"name,omitempty"`,表示欄位為零值時省略輸出。本工具預設不生成 omitempty,可在生成後按需手動新增。
JSON 類型到 Go 類型映射速查表
本工具根據 JSON 值的類型自動推斷對應的 Go 類型,常見映射關係如下:
| JSON 值範例 | 生成 Go 類型 | 說明 |
|---|---|---|
"hello" | string | 字串直接映射 |
true / false | bool | 布林值 |
42 | int64 | 無小數點的數字 |
3.14 | float64 | 含小數點的數字 |
null | interface{} | 無法推斷具體類型時的安全兜底 |
["a","b"] | []string | 字串陣列 |
[1,2,3] | []int64 | 整數陣列 |
[{...},{...}] | []UserItem | 物件陣列,元素類型遞迴生成 |
{"id":1} | User | 物件生成獨立 struct |
常見 Go 數字類型選擇建議
工具預設使用 int64 和 float64,實際專案中可按需求調整:
| 場景 | 推薦類型 | 原因 |
|---|---|---|
| 普通整數 ID、計數 | int64 | 與工具預設一致,相容大多數 JSON 數字 |
| 資料庫自增主鍵已知為正 | uint64 | 避免負數,語義更清晰 |
| 32 位元系統或明確小範圍整數 | int32 | 減少記憶體佔用 |
| 價格、經緯度、科學計算 | float64 | 與工具預設一致,標準浮點精度 |
| 精確貨幣計算 | decimal.Decimal / int | float64 有精度風險,建議使用 shopspring/decimal 或以分為單位的 int |
Privacy & Security
本 JSON 轉 Go 工具的所有處理完全在你的瀏覽器本機完成:JSON 解析、類型推斷、Go 程式碼生成全部透過 Web Worker 在用戶端執行,輸入的 JSON 內容、上傳的檔案以及生成的 Go 程式碼都不會上傳到任何伺服器,也不會被記錄、快取或儲存到雲端。關閉或重新整理頁面後,所有輸入和輸出內容自動從記憶體清除,僅 localStorage 會保留你最近輸入的歷史記錄(可隨時清空)。適合處理含 API 金鑰、token、敏感業務資料的 JSON。
- JSON 壓縮
- CSV 轉 JSON
- JSON 轉 CSV
- JSON Diff
- JSON Escape / Unescape
- JSON 扁平化
- JSON 格式化
- JSON 產生器
- JSONPath 查詢
- JSON 合併
- JSON 修復
- JSON Schema 驗證器
- JSON 排序
- JSON Stringify
- JSON 轉 HTML 表格
- JSON 轉 Java
- JSON 轉 Markdown
- JSON 轉 SQL
- JSON 轉 TOML
- JSON 轉 TypeScript
- XML 轉 JSON
- JSON 轉 XML
- YAML 轉 JSON
- JSON 轉 YAML
- JSON 轉 Go
- JSON 轉 Rust
- JSON 轉 Swift
- JSON轉C#
- JSON 轉 C++
- JSON 轉 PHP
- JSON 轉 Python