先简单了解一下JSON

结构体序列化

通过json.Marshal()函数,可将一个结构体转化为JSON。
该函数的返回值为两个参量,第一个为转化后的JSON(如果转化成功),第二个参量就是是否成功将结构体转化成为JSON(如果成功了,这个值为nil)。

package main


import (
	"encoding/json"
	"fmt"
)


type User struct {
	Username string
	Password string
	Token    string
}


func main() {
	P := &User{}
	P.Username = "admin"
	P.Password = "123456"
	P.Token = "Token"
	data, _ := json.Marshal(P)
	fmt.Println(string(data))
}

输出结果为:

{"Username":"admin","Password":"123456","Token":"Token"}

可见,在默认情况下,值所对应的名字就是结构体相应的变量名称。
但是,go中公有成员的首字母都是大写,而我希望在JSON中它是小写怎么办呢?
其实go中有一种方法可以改变它所对应的名字。
就是给每一个变量都打上一个标签。

type User struct {
	Username string `json:"name"`
	Password string `json:"password"`
	Token    string
}

输出的结果就是

{"name":"admin","passwoed":"123456","Token":"Token"}

像下面这种情况,一些没有意义的东西也被输出了。

{"name":"admin","passwoed":"123456","Token":"Token","IP":""}

通过缺省标记omitempty,我们可以避免输出零值的情况。

type User struct {
	Username string `json:"name"`
	Password string `json:"passwoed"`
	Token    string
	IP       string `json:"IP,omitempty"`
}

解析JSON

在"encoding/json"包中,提供了json.Unmarshal()。

package main


import (
	"encoding/json"
	"fmt"
)


type User struct {
	Username string `json:"name"`
	Password string `json:"passwoed"`
	Token    string
	IP       string `json:"IP,omitempty"`
}


func main() {
	P := &User{}
	P.Username = "admin"
	P.Password = "123456"
	P.Token = "Token"
	data, _ := json.Marshal(P)
	fmt.Println(string(data))
	var pp User
	json.Unmarshal(data, &pp)
	fmt.Println(pp)
}

输出结果:

{"name":"admin","passwoed":"123456","Token":"Token"}
{admin 123456 Token }

json.Unmarshal()第一个参量是JSON,第二个是结构体。
如果解析成功,函数的返回值就是nil。