Go圣经-学习笔记之复合类型(三)
2017-10-24 00:00
316 查看
摘要: json的简单使用
上一篇 Go圣经-学习笔记之复合类型(二)
下一篇 Go圣经-学习笔记之函数和错误处理
在Go语言中,通过json标准库,可以进行数据的序列化和反序列化。它可以序列化map,结构体、数组和slice动态数组、内置的基本数据类型。
我们在这里举三个例子,说明json的使用方法,初学者可能经常只用到一种结构体对象接收和发送数据。
初学者对结构体的json序列化和反序列化比较清楚,对后两种可能很少用,也不会用。
对于数组类型数据,但是有些业务场景前端会使用。
对于map类型,一般会在Go语言的服务端调用第三方REST接口时,服务端只想要指定的返回码,判断是否调用成功时。程序猿不想写整体的struct结构体定义,也可能是比较懒,然后用了一个map[string]interface{}去接收返回数据。这时候通过json标准库中的Unmarshal反序列化后,然后通过map["err_code"].(int)获取返回码,然后再做其他后续处理逻辑。
这里还要说明一个结构体时,有时候我会用到的特性,结构体的json支持的标签值特性omitempty,例如:
它表示,当函数omitempty的标签值时,它所对应的结构体的数据元素值如果是零值,则它不会输出。那就是说如果服务端返回的结构体数据中的某个元素为空时,不返回给前端这个元素,就可以使用omitempty的json标签值属性。
在这里给大家提供一个滴滴公司的一位高级工程师taowen写的json解析库,世界上最快的。github地址:jsoniter。
上一篇 Go圣经-学习笔记之复合类型(二)
下一篇 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。
相关文章推荐
- Go圣经-学习笔记之复合类型(二)
- Go圣经-学习笔记之复合类型
- go语言学习笔记(7) 类型-复合类型
- Go语言学习笔记(4)复合类型
- Go圣经-学习笔记之基础数据类型
- Go圣经-学习笔记入门bufio.Scanner
- C++学习笔记之八 复合类型---数组的替代品vector和array
- 2012/1/11 《C++ Primer Plus》第四章:复合类型 学习笔记
- Go学习笔记之基础数据类型
- Go圣经-学习笔记入门bufio
- Go学习笔记之高级数据类型
- Golang学习笔记(2)---go语言基本类型
- C++学习笔记之四 复合类型1
- C++学习笔记(三)复合数据类型
- Go圣经-学习笔记之error接口
- Go圣经-学习笔记入门-面试题
- C++学习笔记之八 复合类型---指针、数组和指针运算
- Go语言学习笔记(二) [变量、类型、关键字]
- C++学习笔记之五 复合类型之结构体(struct)
- PHP学习笔记【3】_复合数据类型