go语言开发基础36 - 之go语言里的json序列化使用
作为先天具有高并发的go语言,经常用于网络传输,go语言为我们提供了json的数据封装,
便于数据的交换和解析。下面来看看go语言中的json使用。代码最为明显。
JSON(JavaScript Object Notation) 是一种轻量级的数据传输格式。类似于XML,传输效率高,易于人阅读和编写。同时也易于机器解析和生成。
一、json使用实例
1.1、json序列化和反序列化结构体类型数据
package main import ( "fmt" "encoding/json" // 导入json包 ) // 自定义结构体类型 type User struct { UserName string `json:"username"` NickName string `json:"nickname"` Age int Birthday string Sex string Email string } func structJson() { // 定义结构体类型变量并初始化 user1 := &User { UserName: "Dream Person", NickName: "Dream", Birthday: "2008/8/8", Age: 18, Sex: "男", Email: "zmr@dream.com", } // 定义结构体类型变量 var userResult User // 使用json序列化user1变量(返回一个byte类型的列表和错误信息) data, err := json.Marshal(user1) // 判断序列化是否有错误 if err != nil { fmt.Println("json.Marshal err:",err) } // 打印序列化后的结果(序列化后是byte类型,需要转化为字符串类型) fmt.Printf("序列化后的结果为:%s,类型为:%T\n",string(data),data) // 结果为:序列化后的结果为:{"username":"Dream Person","nickname":"Dream","Age":18,"Birthday":"2008/8/8","Sex":"男","Email":"zmr@dream.com"},类型为:[]uint8 // json反序列化,接收的变量一定要传地址,否则无法将反序列化后的结果存到变量里(传值只会修改变量的副本) json.Unmarshal(data, &userResult) fmt.Println("反序列化后的结果为:", userResult) // 结果为:{Dream Person Dream 18 2008/8/8 男 zmr@dream.com} }
1.2、json序列化和反序列化map类型的数据
package main import ( "fmt" "encoding/json" // 导入json包 ) // map序列化 func mapJson() { var m map[string]interface{} // 定义map变量 var mResult map[string]interface{} mResult = make(map[string]interface{}) m = make(map[string]interface{}) // 初始化 m["username"] = "user1" // 赋值 m["age"] = 19 m["sex"] = "男" data, err := json.Marshal(m) // 序列化 if err != nil { // 错误判断 fmt.Println("json.Marshal err:",err) return } fmt.Printf("序列化后结果为:%s\n",string(data)) // 结果为:序列化后结果为:{"age":19,"sex":"男","username":"user1"} // json反序列化,接收的变量一定要穿内存地址,否则无法将反序列化的值存到变量里(传值会修改变量的副本,所以一定要传内存地址) json.Unmarshal(data, &mResult) fmt.Println("反序列化的结果为:", mResult) // 结果为:反序列化的结果为: map[age:19 sex:男 username:user1] }
1.3、json序列化和反序列化切片类型的数据
package main import ( "fmt" "encoding/json" // 导入json包 ) // 序列化切片 func sliceJson() { var m map[string]interface{} var s []map[string]interface{} m = make(map[string]interface{}) var sResult []map[string]interface{} m["username"] = "user1" m["age"] = 19 m["sex"] = "man" s = append(s,m) m = make(map[string]interface{}) m["username"] = "user2" m["age"] = 20 m["sex"] = "feman" s = append(s,m) data, err := json.Marshal(s) if err != nil { fmt.Println("json.Marshal err:",err) } fmt.Printf("序列化后结果为:%s\n",string(data)) // 结果为:序列化后结果为:[{"age":19,"sex":"man","username":"user1"},{"age":20,"sex":"feman","username":"user2"}] // json反序列化,接收反序列化结果的变量一定要传内存地址,传值无法将反序列化后的结果存到变量里 json.Unmarshal(data, &sResult) fmt.Println("反序列化后结果为:", sResult) // 结果为:反序列化后结果为: [map[age:19 sex:man username:user1] map[age:20 sex:feman username:user2]] }