简单的例子
实际中有一个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 天马星空 }
}
}
~~~