GO: 结构体字段后面的 `json` 标注

news/2024/12/25 13:26:37/文章来源:https://www.cnblogs.com/niumachen/p/18630168

在 Go 语言中,在 Go 语言中,结构体字段后面的 json 标注是用来 指定字段在 JSON 数据中的名称处理方式。这个标注告诉 Go 的 encoding/json 包在序列化(将结构体转换为 JSON)和反序列化(将 JSON 转换为结构体)时,如何映射结构体的字段与 JSON 数据中的键。

JSON 标注的基本语法:

type Example struct {Field1 string `json:"field1_name"`Field2 int    `json:"field2_name"`
}

标注格式解释:

  • json:"field1_name":告诉 encoding/json 包,在 JSON 中使用 field1_name 来表示结构体中的 Field1 字段。
  • 标注中的字符串部分可以包含多种指令,用来控制 JSON 的处理方式。

常见的 JSON 标注选项:

  1. 字段名称映射

    • 你可以指定一个结构体字段在 JSON 中的名称。
    • 例如:json:"username" 说明结构体字段的名称是 username,而不是 UserName
    type User struct {Name     string `json:"username"`Age      int    `json:"age"`
    }
    
  2. 忽略某个字段

    • 使用 json:"-" 来告诉 json 包忽略该字段(即在序列化和反序列化时不处理该字段)。
    type User struct {Name     string `json:"username"`Password string `json:"-"`
    }
    

    在这个例子中,Password 字段会被忽略,不会出现在 JSON 中。

  3. 字段的零值处理

    • 如果一个字段的值为零值(例如 ""0false 等),可以通过使用 omitempty 标志来使得该字段在 JSON 输出时被忽略。
    type User struct {Name  string `json:"username,omitempty"`Age   int    `json:"age,omitempty"`
    }
    

    如果 NameAge 字段是零值(如空字符串或 0),它们就不会出现在最终的 JSON 输出中。

  4. 结构体的嵌套

    • 如果结构体是嵌套的,json 标注会自动应用到嵌套的字段。
    type Address struct {Street string `json:"street"`City   string `json:"city"`
    }type User struct {Name    string  `json:"username"`Address Address `json:"address"`
    }
    

    在这种情况下,嵌套结构体 Address 会被序列化成 address 字段,而 Address 结构体内的字段会被序列化为其对应的 JSON 键(例如,StreetCity)。


示例:

package mainimport ("encoding/json""fmt"
)type User struct {Name     string `json:"username"`Age      int    `json:"age,omitempty"`Password string `json:"-"`
}func main() {user := User{Name:     "Alice",Age:      0,  // 这里是零值Password: "secret",}// 将结构体转换为 JSONjsonData, _ := json.Marshal(user)fmt.Println(string(jsonData))  // 输出: {"username":"Alice"}
}

输出结果:

{"username":"Alice"}

在这个例子中,Age 字段因为是零值(0)被 omitempty 忽略,而 Password 字段因为使用了 json:"-" 被完全忽略,不出现在 JSON 输出中。


总结:

  • json 标注帮助我们控制结构体字段与 JSON 数据之间的映射。
  • 可以指定字段名、忽略字段、忽略零值字段。
  • 在序列化和反序列化过程中,json 标注提供了灵活的字段控制。是用来 指定字段在 JSON 数据中的名称处理方式。这个标注告诉 Go 的 encoding/json 包在序列化(将结构体转换为 JSON)和反序列化(将 JSON 转换为结构体)时,如何映射结构体的字段与 JSON 数据中的键。

JSON 标注的基本语法:

type Example struct {Field1 string `json:"field1_name"`Field2 int    `json:"field2_name"`
}

标注格式解释:

  • json:"field1_name":告诉 encoding/json 包,在 JSON 中使用 field1_name 来表示结构体中的 Field1 字段。
  • 标注中的字符串部分可以包含多种指令,用来控制 JSON 的处理方式。

常见的 JSON 标注选项:

  1. 字段名称映射

    • 你可以指定一个结构体字段在 JSON 中的名称。
    • 例如:json:"username" 说明结构体字段的名称是 username,而不是 UserName
    type User struct {Name     string `json:"username"`Age      int    `json:"age"`
    }
    
  2. 忽略某个字段

    • 使用 json:"-" 来告诉 json 包忽略该字段(即在序列化和反序列化时不处理该字段)。
    type User struct {Name     string `json:"username"`Password string `json:"-"`
    }
    

    在这个例子中,Password 字段会被忽略,不会出现在 JSON 中。

  3. 字段的零值处理

    • 如果一个字段的值为零值(例如 ""0false 等),可以通过使用 omitempty 标志来使得该字段在 JSON 输出时被忽略。
    type User struct {Name  string `json:"username,omitempty"`Age   int    `json:"age,omitempty"`
    }
    

    如果 NameAge 字段是零值(如空字符串或 0),它们就不会出现在最终的 JSON 输出中。

  4. 结构体的嵌套

    • 如果结构体是嵌套的,json 标注会自动应用到嵌套的字段。
    type Address struct {Street string `json:"street"`City   string `json:"city"`
    }type User struct {Name    string  `json:"username"`Address Address `json:"address"`
    }
    

    在这种情况下,嵌套结构体 Address 会被序列化成 address 字段,而 Address 结构体内的字段会被序列化为其对应的 JSON 键(例如,StreetCity)。


示例:

package mainimport ("encoding/json""fmt"
)type User struct {Name     string `json:"username"`Age      int    `json:"age,omitempty"`Password string `json:"-"`
}func main() {user := User{Name:     "Alice",Age:      0,  // 这里是零值Password: "secret",}// 将结构体转换为 JSONjsonData, _ := json.Marshal(user)fmt.Println(string(jsonData))  // 输出: {"username":"Alice"}
}

输出结果:

{"username":"Alice"}

在这个例子中,Age 字段因为是零值(0)被 omitempty 忽略,而 Password 字段因为使用了 json:"-" 被完全忽略,不出现在 JSON 输出中。


总结:

  • json 标注帮助我们控制结构体字段与 JSON 数据之间的映射。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/858618.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java开发】如何设计一个全局唯一的订单号?

一、背景介绍二、方案实践2.1 方案一:UUID2.2 方案二:数据库自增2.3 方案三:雪花算法2.4 方案四:分布式组件 总结一、背景介绍 在实际的软件系统开发过程中,由于业务的需要,我们经常需要生成业务单号,例如订单编号、入库单号、投诉服务单号等等,针对这个问题也做了一些…

极致 ElasticSearch 调优,让你的ES 狂飙100倍!

本文原文链接 文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备 免费赠送 :《尼恩技术圣经+高并发系列PDF》 ,帮你 …

开源项目管理系统对比:10款最佳工具详评,助你决策

在当今数字化时代,项目管理的效率和效果直接关系到企业的竞争力和发展前景。开源项目管理系统因其灵活性、可定制性和成本效益,成为众多企业和团队的首选。从初创公司到大型企业,从软件开发团队到市场营销部门,合适的项目管理工具能够帮助团队更好地规划、执行和监控项目,…

java~重写hashcode时为什么要乘以31

在Java中,重写hashCode()方法时常常会使用31作为乘数,这是因为31具有一些独特的数学性质,使其成为一个优秀的选择。以下是几个原因: 1. 奇质数的特性 31是一个奇数和质数,这意味着它能有效地减少哈希冲突的概率。使用质数作为乘数可以帮助分散哈希值,从而提高哈希表的性能…

数据误删?别怕!COS防误删攻略请查收

在云存储领域,数据的安全性始终是悬在头顶的达摩克利斯之剑。长期以来,腾讯云对象存储服务(COS)一直致力于数据安全的探索和实践,以保障数据的安全性和完整性。对象存储COS准备了一份防误删攻略给大家: 背景与意义在云存储领域,数据的安全性始终是悬在头顶的达摩克利斯之…

【日记】拼好了衣架!(524 字)

正文今早不小心把闹钟给关了,继 7:50 闹钟响了之后,下一次睁眼就是 8:28 了。吓得一哆嗦,穿衣服换鞋的速度起飞。到一楼,正好 8:30。还好行长没来(小声。昨天晚上,朝哥给我说他伤好得差不多了,可以开始考虑上课了。我一直在等他说出这句话。暑假班他受伤,完事儿之后我受…

【原创】解决ncnn yolov11 乱框,输出维度出错,无框问题

Abstract 解决:ncnn yolov11 乱框,输出维度出错,无框问题 Solution: ncnn yolov11 has random boxes, incorrect output dimensions, and no boxes 0x00: model export 首先是模型转换问题 最开始,我是用python的ultralytics导出为onnx格式文件(.onnx),这个文件在python的…

polarctf-crypto中等难度wp整理(截止至2024.12)

二进制一个音频文件,听了,不是摩斯电码看了wp,原来是拨号 考察:DTMF拨号音识别 使用dtmf2num这个工具解析这个音频二进制1和0 但是不是,它是01字符变形成摩斯密码,把0替换成.,把1替换成-,把*替换成空格。 得到一组摩斯电码,然后去解即可还要小写md5加密,服了这个老六…

杭州数据恢复之某公司经理的三星移动硬盘摔坏了盘片划伤二次开盘

这是一块老款三星Samsung使用mini USB接口的500G移动硬盘,采用了一体式电路板,型号是HM502JX。硬盘是用户不小心摔坏了,接电脑不识别而且有异响,先送修到百脑汇电脑城某家数据恢复中心进行开盘修复,但被告知盘片有划伤无法恢复数据。很巧用户公司里的一名员工曾经在我们这…

第十七次作业

1、安装最新版phpstudy集成工具并创建一个网站,编写php代码输出网站信息(phpinfo)2、安装vscode,并安装php开发插件、汉化插件、xdebug等插件 中⽂语⾔包安装php调试插件配置Open PHP/HTML/JS In Browser插件3、配置phpstudy集成工具xdebug扩展,并使用vscode对php代码进行…

dataezse接入zabbix监控

常用查询 目录常用查询zabbix 常用库表说明主机资源监控主机资源监控(纯值)oracle状态监控CPU top10DISK TOP 10Memory TOP 10SPACE USERD TOP 10问题告警级别分布问题列表null问题主机组正常主机总数主机问题排行 zabbix 常用库表说明 https://www.cnblogs.com/yaoyaojcy/p/…

MySQL 千万 级数据量根据(索引)优化 查询 速度

MySQL 千万 级数据量根据(索引)优化 查询 速度| Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| -----…