go-json(Marshal与Unmarshal)

Json(Javascript Object Nanotation)是一种数据交换格式,常用于前后端以及客户端和服务端的数据传输。任意一端将数据转换成json 字符串,另一端再将该字符串解析成相应的数据结构,如string类型,strcut对象等。

利用Marshal转化为json

type Stu struct {
    Name  string `json:"name"`
    Age   int
    HIgh  bool
    sex   string
    Class *Class `json:"class"`
}

type Class struct {
    Name  string
    Grade int
}

func main() {
    //实例化一个数据结构,用于生成json字符串
    stu := Stu{
        Name: "张三",
        Age:  18,
        HIgh: true,
        sex:  "男",
    }

    //指针变量
    cla := new(Class)
    cla.Name = "1班"
    cla.Grade = 3
    stu.Class=cla

    //Marshal失败时err!=nil
    jsonStu, err := json.Marshal(stu)
    if err != nil {
        fmt.Println("生成json字符串错误")
    }

    //jsonStu是[]byte类型,转化成string类型便于查看
    fmt.Println(string(jsonStu))
}

println

{"name":"张三","Age":18,"HIgh":true,"class":{"Name":"1班","Grade":3}}

从结果中可以看出

只要是可导出成员(变量首字母大写相当于公有变量),都可以转成json。因成员变量sex是不可导出的(变量首字母小写),故无法转成json。

如果变量打上了json标签,如Name旁边的 `json:"name"` (json的标签),那么转化成的json key就用该标签“name”,否则取变量名作为key,如“Age”,“HIgh”。

bool类型也是可以直接转换为json的value值。Channel, complex 以及函数不能被编码json字符串。当然,循环的数据结构也不行,它会导致marshal陷入死循环。

指针变量,编码时自动转换为它所指向的值,如cla变量。 
(当然,不传指针,Stu struct的成员Class如果换成Class struct类型,效果也是一模一样的。只不过指针更快,且能节省内存空间。)

Class *Class `json:"class"`

    cla := new(Class)
    cla.Name = "1班"
    cla.Grade = 3
    stu.Class=cla

Class Class `json:"class"`

    var cla = Class
    cla.Name = "1班"
    cla.Grade = 3
    stu.Class=cla

243.821us 270.331us

最后,强调一句:json编码成字符串后就是纯粹的字符串了。

同时,编码成json串的数据结构,往往是切片类型。如下定义了一个[]StuRead类型的切片。

Json Unmarshal:将json字符串解码到相应的数据结构

	str:=[]byte(jsonStu)

	//1.Unmarshal的第一个参数是json字符串,第二个参数是接受json解析的数据结构。
	//第二个参数必须是指针,否则无法接收解析的数据,如stu仍为空对象StuRead{}
	//2.可以直接stu:=new(StuRead),此时的stu自身就是指针
	stu1:=Stu{}
	err1:=json.Unmarshal(str,&stu1)
	//解析失败会报错,如json字符串格式不对,缺"号,缺}等。
	if err1!=nil{
		fmt.Println(err)
	}

	fmt.Println(stu1)

解析结果

 

你可能感兴趣的:(go语言学习)