1.序列化与反序列化
1.序列化-------把go语言中的结构体变量转换成为json格式的字符串
2.反序列化-----把json格式的字符串转换成为go语言中的结构体变量
package main
import (
"encoding/json"
"fmt"
)
type person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
p1 := person{
Name: "周琳",
Age: 18,
}
b, _ := json.Marshal(p1) //转化后,b里面是转化的结果
fmt.Println(string(b))
//反序列化
str := `{"name":"zhou","age":18}`
var p2 person
_ = json.Unmarshal([]byte(str), &p2) //传指针是为了在内部修改p2的值
fmt.Printf("%#v", p2)
}
//{"name":"周琳","age":18}
//main.person{Name:"zhou", Age:18}
2.结构体里的变量不加tag能不能正常转成json里的字段?
- 如果变量
首字母小写,则为private。无论如何不能转,因为取不到反射信息。 - 如果变量
首字母大写,则为public。 -
不加tag,可以正常转为json里的字段,json内字段名跟结构体内字段原名一致。加了tag,从struct转json的时候,json的字段名就是tag里的字段名,原字段名失效
package main
import (
"encoding/json"
"fmt"
)
type J struct {
a string //小写无tag
b string `json:"B"` //小写+tag
C string //大写无tag
D string `json:"DD"` //大写+tag
}
func main() {
j := J {
a: "1",
b: "2",
C: "3",
D: "4",
}
fmt.Printf("转为json前j结构体的内容 = %+v\n", j)
jsonInfo, _ := json.Marshal(j)
fmt.Printf("转为json后的内容 = %+v\n", string(jsonInfo))
}
//转为json前j结构体的内容 = {a:1 b:2 C:3 D:4}
//转为json后的内容 = {"C":"3","DD":"4"}
可以发现 a,b 序列化失败
C 没有 tag 就是用的变量名字
D 有 tag 就使用的 tag 名字