Golang結構體與JSON相互轉換時的小技巧
阿新 • • 發佈:2020-11-27
簡單的例子
實際中有一個Adset的結構體定義如下:
type Adset struct{ Cost int64 `json:"cost"` Name string `json:"name"` msg string // 小寫的不會被json解析 }
建立一個Adset結構體並序列化如下:
package main import ( "encoding/json" "fmt" ) type Adset struct{ Cost float64 `json:"cost"` Name string `json:"name"` msgstring // 小寫的不會被json解析 } func main() { // 定義一個結構體初始化 stucent := Adset{123.33,"天馬星空","666"} // 將結構體轉成json格式 data, err := json.Marshal(stucent) if err == nil{ fmt.Printf("%s\n",data)//{"cost":123.33,"name":"天馬星空"} } }
實際中的問題
在實際中,雖然我們將結構體的cost欄位定義成了float64型別的,但是在與前端互動的時候(或者通過RPC呼叫獲取別的渠道的資料的時候),有可能別人傳過來的是一個字串型別的資料,這時候我門需要使用strconv模組將字串型別轉成float型別再進行自己邏輯的處理。
本文介紹一下另外一種做法。
解決方案
在定義結構體的時候,直接這樣做就好了:
package main import ( "encoding/json" "fmt" ) type Adset struct{ Cost float64 `json:"cost,string"` // 將cost欄位解析為string型別的資料 Name string `json:"name"` msg string // 小寫的不會被json解析 } func main() { // 定義一個結構體切片初始化 stucent := Adset{123.33,"天馬星空","666"} // 將結構體轉成json格式 data, err := json.Marshal(stucent) if err == nil{ // 注意這裡將 Id轉換為了string fmt.Printf("%s\n",data)//{"cost":"123.33","name":"天馬星空"} } // 特別注意反序列化的寫法!!! // json反序列化為結構體 這裡的cost是 字串型別的。。。 s := `{"name":"天馬星空","cost":"123.3321"}` var obj Adset if err := json.Unmarshal([]byte(s),&obj);err != nil{ fmt.Println("err>>",err) }else{ // 反序列化後 成了 float64 (,string 的作用) fmt.Printf("%T \n",obj.Cost)// float64 fmt.Printf("%v \n",obj)// {123.3321 天馬星空 } } }
~~~