内容简介:官方提供有Json解析包:官方库文档地址•字段的tag是“-”,那么这个字段不会输出到JSON•tag中带有自定义名称,那么这个自定义名称会出现在JSON的字段名中。
JSON是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。
官方提供有Json解析包:官方库文档地址
下面只说两个比较重要的函数
一、将数据编码成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 main import ( "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 main import ( "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)) } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 《深入解析Go》笔记
- Nginx源码阅读笔记-配置解析流程
- Android逆向笔记 —— DEX 文件格式解析
- Python爬虫笔记3-解析库Xpath的使用
- 笔记-runtime源码解析之让你彻底了解底层源码
- 程序员笔记|全面解析Oracle等待事件的分类、发现及优化
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。