阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

json数据的序列化和反序列化

38次阅读
没有评论

共计 1821 个字符,预计需要花费 5 分钟才能阅读完成。

导读 json 的全称是 Javascript object notation, 中文全称:js 对象表示法。在序列化和反序列化的协议中,有:json、xml、yaml、protocol buffer 等。其中 json 是前后端 API 契约数据的主要传输形式。json 支持数值、布尔值、数组和对象四种数据类型。通过这四种数据类型,可以构建复杂的数据模型。

在 Go 语言中,通过 json 标准库,可以进行数据的序列化和反序列化。它可以序列化 map,结构体、数组和 slice 动态数组、内置的基本数据类型。

我们在这里举三个例子,说明 json 的使用方法,初学者可能经常只用到一种结构体对象接收和发送数据。

json 数据的序列化和反序列化

结构体

type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}


func main() {
var (
newPer Person
bts []byte
)
per:=Person{
Name: "Lily",
Age: 29,
}
// 序列化
if bts, err = json.Marshal(per); err !=nil{
log.Fatal(err.Error())
return
}


if err = json.Unmarshal(bts, &newPer); err !=nil{
log.Fatal(err.Error())
return
}
fmt.Println(newPer)
}

map

func main() {
var (
smap = map[string]int{
"Age": 28,
"Sex": 1,
"Floor": 12,
}
newSmap = make(map[string]int)
bts []byte
)
if bts, err = json.Marshal(smap); err !=nil {
log.Fatal(err.Error())
return
}
if err = json.Umarshal(bts, &newSmap); err !=nil {
log.Fatal(err.Error())
return
}
fmt.Println(newSmap)
}

数组或者 slice 动态数组

func main() {
var (
ages []int = []int{23, 20, 28, 25, 30}
bts []byte
err error
newAges = make([]int, len(ages))
)
if bts, err = json.Marshal(ages); err != nil {
fmt.Println(err.Error())
return
}
if err = json.Unmarshal(bts, &newAges); err != nil {
fmt.Println(err.Error())
return
}
fmt.Println("new ages:", newAges)
return
}

初学者对结构体的 json 序列化和反序列化比较清楚,对后两种可能很少用,也不会用。

  • 对于数组类型数据,但是有些业务场景前端会使用。
  • 对于 map 类型,一般会在 Go 语言的服务端调用第三方 REST 接口时,服务端只想要指定的返回码,判断是否调用成功时。程序猿不想写整体的 struct 结构体定义,也可能是比较懒,然后用了一个 map[string]interface{} 去接收返回数据。这时候通过 json 标准库中的 Unmarshal 反序列化后,然后通过 map[“err_code”].(int) 获取返回码,然后再做其他后续处理逻辑。

这里还要说明一个结构体时,有时候我会用到的特性,结构体的 json 支持的标签值特性 omitempty,例如:
type Person struct {
Name string `json:"name,omitempty"`
Age int `json:"age"`
}
它表示,当函数 omitempty 的标签值时,它所对应的结构体的数据元素值如果是零值,则它不会输出。那就是说如果服务端返回的结构体数据中的某个元素为空时,不返回给前端这个元素,就可以使用 omitempty 的 json 标签值属性。

在这里给大家提供一个滴滴公司的一位高级工程师 taowen 写的 json 解析库,世界上最快的。github 地址:jsoniter。

文章转载自 开源中国社区 [http://www.oschina.net]

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-24发表,共计1821字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中