Go圣经-学习笔记之复合类型(三)


声明:本文转载自https://my.oschina.net/u/3287304/blog/1555330,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

上一篇 Go圣经-学习笔记之复合类型(二)

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

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

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

我们在这里举三个例子,说明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

本文发表于2017年10月24日 12:34
(c)注:本文转载自https://my.oschina.net/u/3287304/blog/1555330,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2847 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

万稳万当,不如一默。任何一句话,你不说出来便是那句话的主人,你说了出来,便是那句话的奴隶。

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1