先简单了解一下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。