實用工具
輸入
結果
結果會顯示在這裡。encoding/json 要反序列化一段資料之前,你需要一個對應的 struct:欄位名稱符合 Go 的命名風格,並以 json tag 將每個欄位對應回原本的鍵。這裡使用 quicktype 的 Go 產生器,從樣本自動產生:stargazers_count 會變成 StargazersCount 並帶上 tag json:"stargazers_count",巢狀物件會成為各自具名的 struct,有時為 null 的欄位則變成指標,讓 null 與零值仍然可以區分。輸出以 package 宣告和所用到的 import 開頭,所以是一個完整的 Go 檔案;加進專案時,把 package main 改成你自己的套件名稱即可。
它是怎麼運作的
- 欄位名稱遵循 Go 的縮寫慣例,所以 id 變成 ID、html_url 變成 HTMLURL,符合 linter 的預期。
- 在所有樣本中都是整數的數字會成為 int64;只要出現一個小數值,這個欄位就會變成 float64。
- RFC 3339 時間戳記的型別是 time.Time,encoding/json 不需要自訂程式碼就能解析;關閉日期偵測則保留為字串。
- omitempty 選項會在每個 tag 加上 ,omitempty,將 struct 再序列化回 JSON 時,零值會被省略。
你的資料去了哪裡
哪也沒去。本工具完全在你的瀏覽器裡執行:你貼上的文字由頁面處理,不會傳輸到任何伺服器,也不會寫進任何紀錄。
本工具免費且免登入,執行結果只存在於你目前的頁面裡,不會被儲存到任何地方。
它要花多少
本工具完全免費,不需要登入,也不消耗點數。
常見問題
- 為什麼有些欄位是指標?
- Go 用指標來區分「不存在或為 null」與零值。GitHub 範例資料中的 homepage 在一個儲存庫裡是字串,在另一個裡是 null,所以會變成 *string。如果用一般的 string,null 會變成空字串,你就再也分不出這兩種情況。
- 為什麼某個欄位的型別是 interface{}?
- 當每個樣本值都是 null 時,就沒有型別可以推斷,因此欄位保留為可接受任何值的 interface{}。知道真正的型別後再手動替換,或加入一個該欄位有值的樣本重新產生。
- 這和 mholt/json-to-go 一樣嗎?
- 做的是同一件事——Matt Holt 的 json-to-go 是這類用途歷史悠久的瀏覽器工具——但這裡的引擎是 quicktype,它會把相同的結構合併成一個 struct,並透過比較陣列元素標出選用欄位。兩者的輸出風格相當接近,產生的 struct 都能放進同一個程式碼庫。
- 要不要開啟 omitempty?
- 只有在空值真的代表「不要傳」時才開。使用 omitempty 後,false、0 和空字串在序列化時都會消失,所以會區分 false 與缺少欄位的 API,對你的請求就會有不同的解讀。對只用來反序列化的 struct 而言,這個 tag 沒有任何影響。
背後的開源專案
本工具執行在 glideapps/quicktype 之上,以 Apache-2.0 授權發布。如果你需要在自己的程式裡實作同樣的能力,直接用這個函式庫。
glideapps/quicktype也常被稱作
- json 轉 go
- json 轉 go struct
- golang struct 產生器
- json to struct 線上
- go json tag
- json 轉 golang