我们知道在 Go
语言中无论是变量、常量还是函数,对于首字母大小写有不同的处理。
- 首字母大写,标志着该字段或者函数是能导出的,也就是可以被其它包所能访问的;
- 首字母小写,标志着该字段是私有的,只能在本包内使用;
同样对于结构体而言也是这样,而结构体里面的字段在转换为 json
对象的时候也存在这个问题。
我们看下面代码:
type Student struct {
id int // 首字母小写、无 tag
name string `json:"name"` // 首字母小写、有 tag
Age int // 首字母大写、无 tag
Mobile string `json:"mobile"` // 首字母大写、有 tag
}
func main() {
s := Student{
id: 20210901,
name: "wohu",
Age: 20,
Mobile: "123456",
}
fmt.Printf("转换 json 前的内容为 %+v\n", s) // %+v类似%v,但输出结构体时会添加字段名
jsonContent, _ := json.MarshalIndent(s, "", " ")
fmt.Printf("转换 json 后的内容为\n%v\n", string(jsonContent))
}
输出的结果为:
转换 json 前的内容为 {id:20210901 name:wohu Age:20 Mobile:123456}
转换 json 后的内容为
{
"Age": 20,
"mobile": "123456"
}
从上面的输出结果,我们对于结构体转 json
得出以下结论:
- 结构体成员首字母小写,无论是否加
tag
都无法转换为json
字段,即json
中会丢弃首字母小写的字段值; - 结构体成员首字母大写,分以下两种情况:
- 不加
tag
转换为json
后的字段名和结构体当前的字段名一致; - 加
tag
转换为json
后的字段名与tag
里面的字段名一致,结构体中原来的值就被抛弃;