【Golang】Marshal和Unmarshal
JSON Marshal:数据编码转化成Json字符串
package main
import (
"fmt"
"encoding/json"
)
type Stu struct{
Name string `json:"name"`
Age int
High bool
sex string //可导出成员(变量首字母大写),都可以转化为json,所以sex不可导出,无法转成json
Class *Class `json:"class"`
}
type Class struct{
Name string
Grade int
}
func main(){
stu := Stu{
Name:"张三",
Age :20,
sex :"man",
High:true,
}
//指针变量
cla := new(Class)
cla.Name = "89班"
cla.Grade = 5
stu.Class=cla
jsonStu, err := json.Marshal(stu)
if err!=nil{
fmt.Println("生成json字符串错误")
}
fmt.Println("string(jsonStu) :",string(jsonStu))
}
- 如果变量打上了json标签,如Name旁边的的
json:"name",那么转换成的json key就用该标签"name",否则,取变量名作为key,如Str结构体内的Age、Heigh。 - bool类型也可以转化为json的vaule值,bool-->bool。Channel,complex(复数)以及函数不能被编码为json字符串。循环的数据结构也不行,会导致marshal陷入死循环
- 指针变量,编码时自动转换成它所指向的值,如cla变量
- json编码成为字符串后就是纯粹的字符串
使用interface{}空接口来接受各种类型数据变量
type Stu struct{
Name interface{} `json:"name"`
Age interface{}
High interface{}
sex interface{}
Class interface{} `json:"class"`
}
type Class struct{
Name string
Grade int
}
//示范
//方式一 只声明,不分配内存
var stus1 [] *StuRead
//方式二 分配初始值为0的内存
stus2 := make([] *StuRead,0)
//new()只能实例化一个对象,[]StuRead是切片,不是对象
//方式一、方式二创建的切片,都能追加数据
//方式二最好分配0长度,append时会自动追加增长,如果指定初始长度则不会自动增长长度(cap),导致数据丢失【知识点:append时 如果cap不够,那么cap就会翻倍】
stus1 := append(stus1,stu1,stu2)
stus2 := append(stus2,stu2,stu2)
//成功编码
json1,_ := json.Marshal(stus1)
json2._ := json.Marshal(stus2)
解码时定义对应的切片即可