Encode
golang和json的類型對應(yīng)關(guān)系如下:
- bool類型 -- JSON的Boolean
- 整數(shù),浮點(diǎn)數(shù)等數(shù)值類型 -- JSON的Number
- string -- JSON的字符串(帶""引號)
- struct -- JSON的Object (再根據(jù)各個(gè)成員的類型遞歸打包)
- 數(shù)組或切片 -- JSON的Array
- []byte -- 會(huì)先進(jìn)行base64編碼然后轉(zhuǎn)換為JSON字符串
- map -- JSON的Object冰肴。key必須是string
- interface{} -- 按照內(nèi)部的實(shí)際類型進(jìn)行轉(zhuǎn)換
- nil -- JSON的null
- channel,func等類型 -- 返回UnsupportedTypeError
在golang中黔宛,encoding/json包下函數(shù)Marshal可以將結(jié)構(gòu)體編碼為json格式
func Marshal(in interface{}) (out []byte, err error)
type Student struct {
Name string
Age int
Sex string
}
func main() {
var stu = Student{"dtc", 22, "boy"}
//將結(jié)構(gòu)體封裝成json格式,并返回[]byte
j, err := json.Marshal(stu)
if err != nil {
fmt.Errorf("Marshal Error %v", err)
}
fmt.Println(string(j))
}
output: {"Name":"dtc","Age":22,"Sex":"boy"}
結(jié)構(gòu)體中大寫開頭的變量才可以被json處理雳殊,小寫開頭不會(huì)被處理
Decode
encoding/json包下函數(shù)Unmarshal可以將json解碼為struct
Mashal時(shí)橘沥,結(jié)構(gòu)體的成員變量名將會(huì)直接作為JSON Object的key打包成JSON(前提是struct中的變量首字母大寫);Unmashal時(shí)夯秃,會(huì)自動(dòng)匹配對應(yīng)的變量名進(jìn)行賦值座咆,大小寫不敏感(前提是struct中的變量首字母大寫)
func Unmarshal(p []byte, v interface{}) error
type Student struct {
Name string
AgE int
sex string
}
func main() {
str := []byte(`{"name":"hiehie","age":22,"sex":"girl"}`)
var stu Student
err := json.Unmarshal(str, &stu)
if err != nil {
fmt.Println(err)
}
fmt.Println(stu)
}
output: {hiehie 22 }
StructTag
可以通過打標(biāo)簽的方式手動(dòng)的配置struct變量和json字段之間的關(guān)系。
type Student struct {
Name string `json:"stu_name"`
Age int `json:"stu_age"`
Sex string `json:"stu_sex"`
}
func main() {
str := []byte(`{"stu_name":"hiehie","stu_age":22,"stu_sex":"girl"}`)
var stu Student
err := json.Unmarshal(str, &stu)
if err != nil {
fmt.Println(err)
}
fmt.Println(stu)
}
output: {hiehie 22 girl}
type Student struct {
Name string `json:"stu_name"`
Age int `json:"stu_age"`
Sex string `json:"stu_sex"`
}
func main() {
var stu Student = Student{Name: "gigi", Age: 22, Sex: "girl"}
s, err := json.Marshal(stu)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(s))
}
output: {"stu_name":"gigi","stu_age":22,"stu_sex":"girl"}
tag中設(shè)定omitempty仓洼,如果該字段為nil或零值介陶,則打包的JSON結(jié)果不會(huì)有這個(gè)字段。想要忽略的字段色建,可以在tag中設(shè)置為"-"
type Student struct {
Name string `json:"stu_name"`
Age int `json:"stu_age,omitempty"`
Sex string `json:"-"`
}
func main() {
var stu Student = Student{Name: "kk", Age: 0, Sex: "girl"}
s, err := json.Marshal(stu)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(s))
}
output: {"stu_name":"kk"}
interface{}
在不知道JSON數(shù)據(jù)的格式時(shí)哺呜,struct中的類型可以使用interface{}。
interface{}類型在Unmarshal時(shí)箕戳,會(huì)自動(dòng)將JSON轉(zhuǎn)換為對應(yīng)的數(shù)據(jù)類型:
- JSON的boolean 轉(zhuǎn)換為bool
- JSON的數(shù)值 轉(zhuǎn)換為float64
- JSON的字符串 轉(zhuǎn)換為string
- JSON的Array 轉(zhuǎn)換為[]interface{}
- JSON的Object 轉(zhuǎn)換為map[string]interface{}
- JSON的null 轉(zhuǎn)換為nil
type Student struct {
Name interface{} `json:"name"`
Age interface{} `json:"age"`
Sex interface{} `json:"sex"`
}
func main() {
str := []byte(`{"name":"kk","age":22,"sex":"girl"}`)
stu := new(Student)
err := json.Unmarshal(str, stu)
if err != nil {
fmt.Println(err)
}
fmt.Println(*stu)
}
output:{kk 22 girl}