知识分享之Golang——json与omitempty的使用
背景
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。
知识分享系列目前包含Java、Golang、Linux、Docker等等。
开发环境
- 系统:windows10
- 语言:Golang
- 组件库:Bleve
- golang版本:1.17
- 组件官网:http://blevesearch.com/
- 组件仓库:https://github.com/blevesearch/bleve
- 开源协议:Apache-2.0 License
内容
在我们使用golang时经常需要创建一些结构体,而结构体经常需要被序列化或者反序列化,因此有效的标记名称是我们日常使用最频繁的,下面是我对于json和其中的omitempty的使用用例,有学习到这里的小伙伴们可以进行参考一下,便于快速理解json和omitempty。
package main
import (
"encoding/json"
"fmt"
type User struct {
UserId string
UserName string
age int
sex string
}
type User2 struct {
UserId string `json:"id"`
UserName string `json:"name"`
Age int `json:"age"`
Sex string `json:"sex"`
}
type User3 struct {
UserId string `json:"id"`
UserName string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
Sex string `json:"sex,omitempty"`
}
type User4 struct {
UserId string `json:"id"`
UserName string `json:"name,omitempty"`
Age int `json:"-"`
Sex string `json:"sex,omitempty"`
}
func main() {
u := User{
UserId: "1",
UserName: "张三",
age: 20,
sex: "男",
}
data, err := json.Marshal(u)
if err != nil {
fmt.Println(err.Error())
}
u2 := User2{
"1",
"张三",
20,
"男",
}
data2, _ := json.Marshal(u2)
u3 := User3{
UserId: "1",
}
data3, _ := json.Marshal(u3)
u4 := User2{
UserId: "1",
}
data4, _ := json.Marshal(u4)
u5 := User4{
UserId: "1",
UserName: "张三",
Sex: "男",
}
data5, _ := json.Marshal(u5)
fmt.Printf("%s :只打印大写,小写自动忽略,只允许内部使用,json没有标记,因此默认使用变量名\n", string(data))
fmt.Printf("%s :全部大写,并且使用json标记,因此序列化后自动使用json标记名称\n", string(data2))
fmt.Printf("%s :全部大写,并且使用json标记,增加omitempty标记,带有该标记的不赋值的情况\n", string(data3))
fmt.Printf("%s :全部大写,并且使用json标记,没有omitempty标记,上次字段依旧不赋值的情况\n", string(data4))
fmt.Printf("%s :全部大写,并且使用json的-标记,没有omitempty标记,上次字段依旧不赋值的情况\n", string(data5))
}
经过上述的案例,我们可以得出如下几项结论:
1、没有json标记时默认字段名称大写则序列化时默认使用该字段名。
2、没有json标记时默认字段名称小写则序列化不会包含在内。
3、有json标记时没有omitempty标记,序列化时将使用配置的json名称(字段大写时)
4、有json标记时有omitempty标记,序列化时将忽略有omitempty并且没有赋值的字段,当具有值时则显示。
5、有json标记时但名称为-时,当该字段值为空,则序列化时将忽略。
本文声明:
本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。