简单的例子
实际中有一个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 ",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 ",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 ",obj.Cost)// float64 fmt.Printf("%v ",obj)// {123.3321 天马星空 } } }
~~~