logo
GeekFormat

JSON 轉 Go

把 JSON 貼到左側,右側自動生成可直接用於 Go 專案的 struct 類型定義。純瀏覽器本機處理,無需註冊或上傳。

相關推薦

關於 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 的強類型存取

使用方法

  1. 在左側編輯器貼上 JSON 內容,或拖曳上傳 .json/.txt 檔案,也可以點擊「範例」載入內建資料。
  2. 等待約 400ms,工具會自動轉換並在右側顯示生成的 Go struct 程式碼。
  3. 如果 JSON 報錯,點擊「修復 JSON」按鈕自動修正常見格式錯誤後繼續生成。
  4. 檢查右側輸出,點擊「複製」貼到 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 / falsebool布林值
42int64無小數點的數字
3.14float64含小數點的數字
nullinterface{}無法推斷具體類型時的安全兜底
["a","b"][]string字串陣列
[1,2,3][]int64整數陣列
[{...},{...}][]UserItem物件陣列,元素類型遞迴生成
{"id":1}User物件生成獨立 struct

常見 Go 數字類型選擇建議

工具預設使用 int64 和 float64,實際專案中可按需求調整:

場景推薦類型原因
普通整數 ID、計數int64與工具預設一致,相容大多數 JSON 數字
資料庫自增主鍵已知為正uint64避免負數,語義更清晰
32 位元系統或明確小範圍整數int32減少記憶體佔用
價格、經緯度、科學計算float64與工具預設一致,標準浮點精度
精確貨幣計算decimal.Decimal / intfloat64 有精度風險,建議使用 shopspring/decimal 或以分為單位的 int

Privacy & Security

本 JSON 轉 Go 工具的所有處理完全在你的瀏覽器本機完成:JSON 解析、類型推斷、Go 程式碼生成全部透過 Web Worker 在用戶端執行,輸入的 JSON 內容、上傳的檔案以及生成的 Go 程式碼都不會上傳到任何伺服器,也不會被記錄、快取或儲存到雲端。關閉或重新整理頁面後,所有輸入和輸出內容自動從記憶體清除,僅 localStorage 會保留你最近輸入的歷史記錄(可隨時清空)。適合處理含 API 金鑰、token、敏感業務資料的 JSON。