GoLang中Json Tag用法实例总结
IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《GoLang中Json Tag用法实例总结》,聊聊JSON、tag,我们一起来看看吧!
- JSON Tag标签的完整语法,包含哪些选项
- 不同选项(输出名/-/omitempty/string)的作用及使用范围
- 特殊注意事项补充
Json中Tag用法汇总
- JSON Tag标签格式为:
json:"FieldName/-/可选,omitempty/可选,string/可选
- 多个选项之间使用 , 逗号分割
- FieldName选项:指定编码后键名称
- 可为空,则使用Struct对应字段名作为JSON输出名
- FieldName非空,则使用指定的FieldName作为JSON输出名
- -符号,输出时忽略此字段;但要注意-,(多一个逗号结尾)时,输出字段名为-的JSON字段,而不是忽略
- omitempty选项:忽略空值
- 包含此选项,输出时字段空值(零值+空值:false、0、nil指针、nil接口值,以及任何空数组、切片、map或字符串)则不输出
- string选项:结果输出为字符串
- 字段结果输出为字符串
- 只适用于字符串、浮点、整数或布尔类型的字段
- 这种额外的编码有时在与 JavaScript 程序通信时使用
- 要注意,如果字段值本身为string时,再次增加JSON的string标签选项,会导致多个引号的情况
// 示例代码:https://go.dev/play/p/ApzFQttV_MB package main import ( "encoding/json" "fmt" "os" ) func main() { type ColorGroup struct { Hello bool `json:"Hello,string"` world bool `json:"World,string"` ID int `json:"id,string"` Name string `json:"name,string"` Colors []string `json:"ColorName,omitempty"` Colors1 []string `json:"ColorName1"` Colors2 []string `json:"ColorName2"` } group := ColorGroup{ Hello: true, world: true, ID: 1, Name: "Reds", Colors: []string{"hello", "world"}, Colors1: nil, Colors2: []string{}, } b, err := json.Marshal(group) if err != nil { fmt.Println("error:", err) } os.Stdout.Write(b) } // 输出结果 //{"Hello":"true","id":"1","name":"\"Reds\"","ColorName":["hello","world"],"ColorName1":null,"ColorName2":[]}
其他注意:
- nil 指针、nil 接口、nil切片等nil类型值,进行编码后为 null JSON 对象
- 空切片、空数组编码为 [] JSON 数组
- map 编码为 {} JSON 对象
- 指针类型值编码为指针所指向的值,接口类型值编码后为对应类型的值
官方 Marshal 函数说明
func Marshal(v interface{}) ([]byte, error)
Marshal 返回变量 v 的 JSON 编码后结果
Marshal 函数会递归的处理变量 v;如果一个值实现了Marshaler接口,并且不是一个nil指针,Marshal 调用其 MarshalJSON 方法来生成 JSON 数据。如果没有 MarshalJSON 方法但实现了 encoding.TextMarshaler 方法,Marshal 调用 MarshalText 方法并将结果编码为 JSON 字符串。nil 指针异常并不是严格意义上的必须,而是模仿了UnmarshalJSON行为中的一个类似的、必须的异常。
否则,Marshal使用以下与类型有关的默认编码:
- 布尔值被编码为JSON布尔值
- 浮点、整数和数值类型值编码为JSON数字
- 字符串值被编码为JSON字符串,被强制为有效的UTF-8,用Unicode替换符文替换无效的字节。为了使JSON能够安全地嵌入到HTML
- 数组和分片的值会被编码为JSON数组,但[]byte会被编码为base64编码的字符串,而nil切片会被编码为null JSON对象值。
- 数组、分片,编码后为 JSON 数组
- []byte空切片,编码后为空数组 []
- nil 切片,编码后为 null
- 结构体类型的值被编码为JSON对象。每个导出的结构字段都会成为对象的成员,使用字段名作为对象的键,除非字段因为下面的原因被省略
- 每个结构字段的编码都可通过存储在结构字段Tag标签的 “json” 键下的格式字符串来定制。格式字符串给出了字段的名称,后面可能有一个用逗号分隔的选项列表。名称可以是空的,以便指定选项而不覆盖默认的字段名
- “omitempty”选项,如果字段为空值,应该从编码中省略,定义为false、0、nil指针、nil接口值,以及任何空数组、切片、map或字符串
- 作为一种特殊情况,如果字段标签是”-“,字段总是被省略的。请注意,一个名称为”-“的字段仍然可以使用标签”-,”来生成
结构体字段Tag标签下 json 键对应格式化字符串说明:
- 给出字段编码后的名称,后面可能有一组逗号分割的选项列表
- 字段名称可以为空,用于在不覆盖默认字段名的情况下指定不同选项
- omitempty选项,字段为空值(false/0/nil指针/nil接口值/空数组/空切片/空map/空字符串)时则跳过编码输出
- 字段标签为-时,此字段总是被忽略;但要注意,名为-的字段出现在-,标签中时仍可以被生成
结构体字段标签和对应含义的一些例子:
// Field appears in JSON as key "myName". // 该字段出现在JSON中时,名为"myName" Field int `json:"myName"` // Field appears in JSON as key "myName" and // the field is omitted from the object if its value is empty, // as defined above. // 该字段出现在JSON中时,名为"myName",如为零值则输出时忽略此字段 Field int `json:"myName,omitempty"` // Field appears in JSON as key "Field" (the default), but // the field is skipped if empty. // Note the leading comma. // 该字段出现在JSON中时,名为"Field",如为零值则输出时忽略此字段 Field int `json:",omitempty"` // Field is ignored by this package. // 该字段当前包输出JSON时忽略 Field int `json:"-"` // Field appears in JSON as key "-". // 该字段出现在JSON中时,名为"-" Field int `json:"-,"`
"string" 选项表示字段以 JSON 格式存储在 JSON 编码的字符串中。它只适用于字符串、浮点、整数或布尔类型的字段。这种额外的编码有时在与JavaScript程序通信时使用。
Int64String int64 `json:",string"`
键名满足以下条件时将被使用:非空字符串,仅由Unicode字母、数字和ASCII标点符号(不包括引号、反斜杠和逗号)组成。
受下文所述的Go可见性规则的限制,匿名结构字段通常可被编码,其内部可导出的字段等价于外部结构中的字段。匿名结构体字段使用其JSON Tag标签中给出名称,而不是匿名的。接口类型的匿名结构字段的处理方式与将该类型作为其名称相同,也不是匿名。
在决定对哪个字段进行marshal或unmarshal时,Go中结构体字段可见性规则进行了调整。如果在同一级别有多个字段,并且该级别是嵌套最少的(且将是通常Go规则所选择的嵌套级别),则适用以下额外规则:
1) 在这些字段中,如果有任何字段是JSON Tag标记的,就只考虑有标记的字段,即使有多个未标记的字段,否则会发生冲突。
2) 如果只有一个字段(根据第一条规则标记或不标记),该字段被选中。
3) 否则有多个字段,都会被忽略;不会发生错误。
Go 1.1中新增了对匿名结构字段的处理。在Go 1.1之前,匿名结构字段被忽略。要在当前版本和早期版本中强制忽略匿名结构字段,请给该字段一个”-“的JSON标签。
Map的值被编码为JSON对象。地图的键类型必须是字符串、整数类型,或者实现了encoding.TextMarshaler接口。通过应用以下规则对Map的键进行排序并作为JSON对象的键使用,但要遵守上面为字符串值描述的UTF-8强制规则。
- 任何字符串类型的键都可以直接使用
- encoding.TextMarshalers 将被编码
- 整数键被转换为字符串
指针类型值被编码为所指向的值,一个 nil 指针会被编码为 null JSON值。
接口类型值编码为接口中包含的值,一个 nil 接口值被编码为 null JSON值。
通道(Channel)、复合类型(complex)和函数值(function)不能进行JSON编码,试图对这样的值进行编码会导致Marshal返回一个UnsupportedTypeError错误。
JSON不能代表循环嵌套的数据结构,Marshal函数也将不处理它们。向Marshal传递循环结构将导致一个错误。
参考
- encoding/json#Marshal
- struct json tag的使用及深入理解
总结
今天关于《GoLang中Json Tag用法实例总结》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

- 上一篇
- golang struct json tag的使用以及深入讲解

- 下一篇
- golang如何操作csv文件详解
-
- 无心的母鸡
- 这篇技术贴出现的刚刚好,太细致了,写的不错,收藏了,关注up主了!希望up主能多写Golang相关的文章。
- 2023-05-21 06:15:44
-
- 难过的玉米
- 很详细,收藏了,感谢作者大大的这篇技术贴,我会继续支持!
- 2023-03-21 12:58:41
-
- 疯狂的夕阳
- 赞 ??,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢up主分享技术文章!
- 2023-02-21 13:41:14
-
- 怕孤独的猫咪
- 这篇文章内容太及时了,太详细了,很好,码住,关注作者了!希望作者能多写Golang相关的文章。
- 2023-01-12 05:11:48
-
- Golang · Go教程 | 13分钟前 |
- Golang模块管理与版本控制技巧
- 359浏览 收藏
-
- Golang · Go教程 | 17分钟前 |
- Golang指针数组与切片区别解析
- 209浏览 收藏
-
- Golang · Go教程 | 31分钟前 |
- Golang实现gRPC双向流聊天教程
- 474浏览 收藏
-
- Golang · Go教程 | 39分钟前 |
- Golang访问者模式动态实现方法
- 441浏览 收藏
-
- Golang · Go教程 | 44分钟前 |
- Golang多模块开发:workspace模式详解
- 266浏览 收藏
-
- Golang · Go教程 | 56分钟前 |
- Go大整数转字符串或整数技巧
- 272浏览 收藏
-
- Golang · Go教程 | 59分钟前 |
- Golang单例模式:sync.Once与init对比解析
- 384浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Golang并发限流方法与优化技巧
- 295浏览 收藏
-
- Golang · Go教程 | 1小时前 | 版本选择 Golang模块
- Golang模块版本选择与稳定性分析
- 320浏览 收藏
-
- Golang · Go教程 | 1小时前 | URL参数 请求头 GolangHTTP 请求体解析 *http.Request
- GolangHTTP头与参数解析技巧详解
- 361浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 514次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 499次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- AI Mermaid流程图
- SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
- 451次使用
-
- 搜获客【笔记生成器】
- 搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
- 440次使用
-
- iTerms
- iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
- 468次使用
-
- TokenPony
- TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
- 489次使用
-
- 迅捷AIPPT
- 迅捷AIPPT是一款高效AI智能PPT生成软件,一键智能生成精美演示文稿。内置海量专业模板、多样风格,支持自定义大纲,助您轻松制作高质量PPT,大幅节省时间。
- 441次使用
-
- golang生成JSON以及解析JSON
- 2023-01-17 329浏览
-
- Go如何实现json字符串与各类struct相互转换
- 2023-01-07 377浏览
-
- Go中使用gjson来操作JSON数据的实现
- 2023-01-07 141浏览
-
- Go 语言 json解析框架与 gjson 详解
- 2023-01-08 203浏览
-
- Go语言中的数据格式(json、xml 、msgpack、protobuf)使用总结
- 2022-12-28 264浏览