go语言序列化
定义嵌套结构体
type Animal struct {
Name string
}
type Person2 struct {
Name string
Age int
Animal Animal
}
使用序列化的包
func main() {
p:= Person2{
Name: "小花",
Age: 121,
Animal: Animal{
Name: "旺财",
},
}
json, err := json.Marshal(&p)
if err !=nil{
panic("error!!!")
}
fmt.Printf(string(json))
}
结果:
{“Name”:“小花”,“Age”:121,“Animal”:{“Name”:“旺财”}}
关于go中序列化之后的json数据为空和json数据的key是大写如何改为小写的问题
假设在上述结构体中,我们给所有的成员变量都是小写开头,只有Animal是大写。那么序列化之后的值就是:
{“”,“Animal”:{}}.
在go语言中小写开头的变量是私有的,大写开头的变量是共有的。把person传入序列化的包中,那么就不是同一个包了,因此访问不到,序列化也就是null。
解决办法:
把变量名改为大写即可。
优化:因为大写不符合书写的规范。因此我们想要拿到属性名是小写的json数据。那么该如何做的?
//在对应的属性名之后加上`json:"字段名"`。这里的字段名就是解析之后的json的key值
type Person2 struct {
Name string `json:"name"`
Age int `json:"age"`
Animal Animal
}
运行结果:
{“name”:“小花”,“age”:121,“Animal”:{“Name”:“旺财”}}。
so 神奇!
go语言反序列化
调用Unmarshal包,帮我转化为指定的结构体数据
我们先把结构小改一下:
type Person2 struct {
Name string `json:"name"`
Age int `json:"age"`
Animal []Animal
}
反序列化成指定的结构体:
str := `{"Name":"小花","Age":121,"Animal":[{"Name":"旺财"},{"Name":"旺财2"}]}`
c1 := &Person2{}
err := json.Unmarshal([]byte(str), c1)
if err != nil {
fmt.Println("json unmarshal failed!")
return
}
fmt.Printf("%v",*c1)
打印的结果:
{小花 121 [{旺财} {旺财2}]}