json格式可以算我们日常最常用的序列化格式之一了,Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支援很好。官方提供的Json解析包已经非常强大,我们接下来讲解Json的序列化与反序列化操作。另外还有一些第三方的Json解析库,也能够高效的操作Json物件,比如simplejson,ffjson等。下面是两个比较重要的函式:
• Json Marshal:将资料编码成json字串
func Marshal(v interface{}) ([]byte, error)
Marshal 用于将struct物件序列化到json物件中。v是interface{}型别,任何型别都实现了空界面。
1:tag中的第一个引数是用来指定别名,比如Name 指定别名为 username `json:"username"`
2:如果不想指定别名但是想指定其他引数用逗号来分隔,omitempty 指定到一个field时,如果在赋值时对该属性未赋值或者对该属性赋值为 zero value,那么将Person序列化成json时会忽略该字段
3:- 指定到一个field时,无论有没有值,将Person序列化成json时都会忽略该字段
4:string 指定到一个field时,比如Person中的Count为int型别 如果没有任何指定在序列化到json之后也是int 比如这个样子 “Count”:0,但是如果指定了string之后序列化之后也是string型别的,那么就是这个样子"Count":"0"
• struct序列化为Json
type Person struct {
Name string `json:"username"`
Age int
Gender bool `json:",omitempty"`
Profile string
OmitContent string `json:"-"`
Count int `json:",string"`
}
func main() {
var p *Person = &Person{
Name: "Mr.Tao",
Age: 21,
Gender: true,
Profile: "I am Mr.Tao",
OmitContent: "OmitContent",
}
if bs, err := json.Marshal(p); err != nil {
panic(err)
} else {
fmt.Println(string(bs))
}
}
var p2 *Person = &Person{
Name: "brainwu",
Age: 21,
Profile: "I am Wujunbin",
OmitContent: "OmitConent",
}
if bs, err := json.Marshal(p2); err != nil {
panic(err)
} else {
//result --> {"username":"brainwu","Age":21,"Profile":"I am Wujunbin","Count":"0"}
fmt.Println(string(bs))
}
• slice序列化为Json
//slice序列化为Json
var aStr []string = []string{"Go", "Java", "Python", "Android"}
if bs, err := json.Marshal(aStr); err != nil {
panic(err)
} else {
//result --> ["Go","Java","Python","Android"]
fmt.Println(string(bs))
}
• map 序列化为Json
var m map[string]string = make(map[string]string)
m["Go"] = "No.1"
m["Java"] = "No.2"
m["C"] = "No.3"
if bs, err := json.Marshal(m); err != nil {
panic(err)
} else {
//result --> {"C":"No.3","Go":"No.1","Java":"No.2"}
fmt.Println(string(bs))
}
• Json Unmarshal:将json字串解码到相应的资料结构,Unmarshal的第一个引数是[]byte,第二个引数是接受json解析的资料结构。
下面我们依次讲解Json的操作。
1:将Json序列化进入结构体
type Person struct {
Name string
Age int
Gender bool
}
func main() {
//1:将Json序列化进入结构体
var p Person
var str = "{"Name":"Mr.Tao","Age":20,"Gender":true}"
json.Unmarshal([]byte(str), &p)
fmt.Println(p.Age)
fmt.Println(p.Name)
}
2::将Json序列化到结构体slice
var ps []Person
var aJson = "[{"Name":"zhangsan","Age":25,"Gender":true}, {"Name":"lisi","Age":20,"Gender":false}]"
json.Unmarshal([]byte(aJson), &ps)
fmt.Println(ps, "len is", len(ps))
3:将Json序列化进Map
var str = "{"Name":"zhuyuqiang","Age":20,"Gender":true}"
var obj map[string]interface{}
json.Unmarshal([]byte(str), &obj)
fmt.Println(obj["Name"])
fmt.Println(obj["Gender"])
4:将Json序列化进Slice
var strs string = `["Go", "Java", "C", "Php"]`
var aStr []string
json.Unmarshal([]byte(strs), &aStr)
//result --> [Go Java C Php] len is 4
fmt.Println(aStr, " len is", len(aStr))