Golang 与 JSON(JavaScript Object Notation)
JSON简介
json是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它是目前主流的数据格式之一
json是易于机器解析和生成,并有效地提升网络传输效率,通常程序在网络传输时会先将数据(结构体、map等)序列化成json字符串,到接收方得到json字符串时,在反序列化恢复成原来的数据类型(结构体、map等)。这种方式已然成为各个语言的标准

关于json语言的详细描述,网上可找的学习资料有很多,这里就不再多说,总之就是key-value的形式
JSON序列化
下面主要介绍 结构体, map和切片的序列化,其它数据类型的序列化类似
实例,将结构体类型,map类型和slice切片类型进行序列化,也就是转化为json字符串
package main
import (
"encoding/json"
"fmt"
)
type student struct {
name string
age int
sex string
}
func jsonStruct() {
stu := student{
name: "Zideng Feng",
age: 22,
sex: "Male",
}
json, err := json.Marshal(&stu)
if err != nil {
fmt.Println("Serialize failed")
} else {
fmt.Println(string(json))
}
}
func jsonMap() {
var mapping map[string]int
mapping = make(map[string]int)
mapping["fzd"] = 22
mapping["zyq"] = 23
mapping["lyc"] = 24
json, err := json.Marshal(mapping)
if err != nil {
fmt.Println("Serialize failed")
} else {
fmt.Println(string(json))
}
}
func jsonSlice() {
var slice = []string{"fzd", "zyq", "lyc"}
json, err := json.Marshal(slice)
if err != nil {
fmt.Println("Serialize failed")
} else {
fmt.Println(string(json))
}
}
func main() {
jsonStruct()
jsonMap()
jsonSlice()
}
输出的结果是:
{}
{"fzd":22,"lyc":24,"zyq":23}
["fzd","zyq","lyc"]
我们可以发现第一个是空的,为啥呢?因为json.Marshal()是其它包中的函数。我们再来看我们的结构体,其中的属性首字母没有大写,呵呵,怪不得调用不了,于是更改如下:
type student struct {
Name string
Age int
Sex string
}
输出的结果是:
{"Name":"Zideng Feng","Age":22,"Sex":"Male"}
{"fzd":22,"lyc":24,"zyq":23}
["fzd","zyq","lyc"]
这其实还不够好,应该再结构体中添加反射机制
type student struct {
Name string `json:"name"`
Age int `json:"age"`
Sex string `json:"sex"`
}
这样输出的结果就是
{"name":"Zideng Feng","age":22,"sex":"Male"}
{"fzd":22,"lyc":24,"zyq":23}
["fzd","zyq","lyc"]
JSON的反序列化
介绍
json反序列化是指将json字符串反序列化成对应的数据类型(比如结构体、map、切片)等操作
下面的案例我们也将介绍将json字符串反序列化成结构体、map和切片
package main
import (
"encoding/json"
"fmt"
)
type student struct {
Name string `json:"name"`
Age int `json:"age"`
Sex string `json:"sex"`
}
func Struct() {
jsonString := "{\"name\":\"Zideng Feng\",\"age\":22,\"sex\":\"Male\"}"
var stu student
err := json.Unmarshal([]byte(jsonString), &stu)
if err != nil {
fmt.Println("Serialize failed")
} else {
fmt.Println(stu)
}
}
func Map() {
jsonString := "{\"fzd\":22,\"lyc\":24,\"zyq\":23}"
var mapping map[string]int
err := json.Unmarshal([]byte(jsonString), &mapping)
if err != nil {
fmt.Println("Serialize failed")
} else {
fmt.Println(mapping)
}
}
func Slice() {
jsonString := "[\"fzd\",\"zyq\",\"lyc\"]"
var slice []string
err := json.Unmarshal([]byte(jsonString), &slice)
if err != nil {
fmt.Println("Serialize failed")
} else {
fmt.Println(slice)
}
}
func main() {
Struct()
Map()
Slice()
}
也比较简单,调用Unmarshal即可,第一个参数就是将string类型变成byte切片,第二个参数就是将要赋值的变量的指针类型
输出的结果是:
{Zideng Feng 22 Male}
map[fzd:22 lyc:24 zyq:23]
[fzd zyq lyc]