簡單的例子
實際中有一個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"` msg string // 小寫的不會被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 天馬星空 } } }
~~~