一、将数据编码成json字符串
函数原型func Marshal(v interface{}) ([]byte, error)
Marshal函数返回v的json编码。v是interface{}类型,任何类型都实现了空接口。
•字段的tag是“-”,那么这个字段不会输出到JSON
•tag中带有自定义名称,那么这个自定义名称会出现在JSON的字段名中。
•tag中如果带有“omitempty”选项,那么如果该字段值为空,就不会输出到JSON串中
•如果字段类型是bool,string,int,int64等,而tag中带有“,string”选项,那么这个字段在输出到JSON的时候会把该字段对应的值转换成JSON字符串
下面是官方给的解释
// 字段被本包忽略Field int `json:"-"`// 字段在json里的键为"myName"Field int `json:"myName"`// 字段在json里的键为"myName"且如果字段为空值将在对象中省略掉Field int `json:"myName,omitempty"`// 字段在json里的键为"Field"(默认值),但如果字段为空值会跳过;注意前导的逗号Field int `json:",omitempty"`
demo
package mainimport ( "encoding/json" "fmt")//Student 结构体type Student struct { Name string Age int}//Person JSON字段标签type Person struct { Name string `json:"username"` //自定义名称 Age int Gender bool `json:",omitempty"` //如果该字段值为空,就不会输出到JSON串中 Profile string OmitContent string `json:"-"` //字段不会输出到JSON Count int `json:",string"` //自定义名称}func main() { //结构体序列化为JSON s := Student{"黄哲", 20} if bs, err := json.Marshal(s); err != nil { panic(err) } else { fmt.Println(string(bs)) //{"Name":"黄哲","Age":20} } //切片序列化为JSON s1 := Student{"张三", 21} s2 := Student{"李四", 22} s3 := Student{"王五", 23} slice := []Student{s1, s2, s3} bs, err := json.Marshal(slice) if err != nil { panic(err) } else { fmt.Println(string(bs)) //[{"Name":"张三","Age":21},{"Name":"李四","Age":22},{"Name":"王五","Age":23}] } //map序列化为JSON var m = make(map[string]string) m["Go"] = "No.1" m["C++"] = "No.2" m["C"] = "No.3" m["C#"] = "No.4" if bs, err := json.Marshal(m); err != nil { panic(err) } else { fmt.Println(string(bs)) //{"C":"No.3","C#":"No.4","C++":"No.2","Go":"No.1"} } //JSON字段标签 var p = &Person{ Name: "HZ", Age: 21, Gender: true, Profile: "from shandong", OmitContent: "OmitContent", } if bs, err := json.Marshal(p); err != nil { panic(err) } else { fmt.Println(string(bs)) } }
二、将json字符串解码到相应的数据结构
函数原型func Unmarshal(data []byte, v interface{}) error
•Unmarshal函数解析json编码的数据并将结果存入v指向的值。
•Unmarshal和Marshal做相反的操作,必要时申请映射、切片或指针。
将json字符串解码到相应的数据结构,Unmarshal的第一个参数是json字符串,第二个参数是接受json解析的数据结构。
demo
package mainimport ( "encoding/json" "fmt")//Student 结构体type Student struct { Name string Age int}//Person JSON字段标签type Person struct { Name string `json:"username"` //自定义名称 Age int Gender bool `json:",omitempty"` //如果该字段值为空,就不会输出到JSON串中 Profile string OmitContent string `json:"-"` //字段不会输出到JSON Count int `json:",string"` //自定义名称}func main() { //结构体序列化为JSON s := Student{"黄哲", 20} bs1, err := json.Marshal(s); if err != nil { panic(err) } else { fmt.Println(string(bs1)) //{"Name":"黄哲","Age":20} } //JSON序列化为结构体 var ss1 Student json.Unmarshal([]byte(bs1), &ss1) fmt.Println(ss1) //切片序列化为JSON s1 := Student{"张三", 21} s2 := Student{"李四", 22} s3 := Student{"王五", 23} slice := []Student{s1, s2, s3} bs2, err := json.Marshal(slice) if err != nil { panic(err) } else { fmt.Println(string(bs2)) //[{"Name":"张三","Age":21},{"Name":"李四","Age":22},{"Name":"王五","Age":23}] } //JSON序列化为切片 slice1 := []Student{} json.Unmarshal([]byte(bs2), &slice1) //JSON转为切片第一个参数为json,转换为byte切片,第二个要保存到地址的引用 fmt.Println(slice1) //map序列化为JSON var m = make(map[string]string) m["Go"] = "No.1" m["C++"] = "No.2" m["C"] = "No.3" m["C#"] = "No.4" bs3, err := json.Marshal(m) if err != nil { panic(err) } else { fmt.Println(string(bs3)) //{"C":"No.3","C#":"No.4","C++":"No.2","Go":"No.1"} } //JSON序列化为map var m1 = make(map[string]string) json.Unmarshal([]byte(bs3), &m1) fmt.Println(slice1) //JSON字段标签 var p = &Person{ Name: "HZ", Age: 21, Gender: true, Profile: "from shandong", OmitContent: "OmitContent", } if bs, err := json.Marshal(p); err != nil { panic(err) } else { fmt.Println(string(bs)) } }
作者:学生黄哲
链接:https://www.jianshu.com/p/bb0b9414d8f9