Go语言omitempty选项的实现
作者:黎明? 发布时间:2024-04-25 15:12:40
在使用Golang的时候,不免会使用Json和结构体的相互转换,这时候常用的就是 json.Marshal 和 json.Unmarshal 两个函数。这时候在定义json结构体的时候,我们会用到 omitempty 这个字段,这个字段作用就是 空值省略,看似简单,但是却有很多小坑,这篇文章带你稍微研究一下他的用途和功能。
omit:
v. 删除; 忽略; 漏掉; 遗漏; 不做; 未能做;
adj. 省略了的;省去的;
基本用法
当我们设置json的struct的时候,会定义每个字段对一个json的格式,比如定义一个dog 结构体:
type Dog struct {
Name string
Weight int
}
现在我们对他进行初始化,将其编码为JSON格式:
func main() {
d := Dog{
Name: "小黑",
Weight: 20,
}
marshalDog, err := json.Marshal(d)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(string(marshalDog))
}
则输出的结果为:
{"Name":"小黑","Weight":20}
现在假如有一个结构体变量我们没初始化,那么结果可能也会跟我们预期的不太一样:
d := Dog{
Name: "小黑",
}
输出的结果为:
{"Name":"小黑","Weight":0}
很明显,狗的weight是未知,而不是0,并不是我们想要的结果,我们更想要的结果是:
{"Name":"小黑"}
为了实现这样的目的,我们这时候应该使用 omitempty 选项来帮我们实现,当我们在Dog结构体加上这个tag的时候:
type Dog struct {
Name string
Weight int `json:",omitempty"`
}
此时,输出结果为:
{"Name":"小黑"}
不能单纯使用omitempty
当结构体相互嵌套的时候,那么omitempty就可能出现问题,比如:
type Variety struct {
Color string
Category string
}
type Dog struct {
Name string
Weight int `json:",omitempty"`
Variety Variety `json:",omitempty"`
}
func main() {
d := Dog{
Name: "小黑",
}
marshalDog, err := json.Marshal(d)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(string(marshalDog))
}
输出结果为:
{"Name":"小黑","Variety":{"Color":"","Category":""}}
omitempty 为什么对嵌套结构体不生效呢?这是因为GO只知道简单结构体例如int,string,pointer 这种类型的空值,不知道Variety类型的空值是什么,为了不显示我们没有提供值的自定义结构体,我们可以使用结构体指针:
type Dog struct {
Name string
Weight int `json:",omitempty"`
Variety *Variety `json:",omitempty"`
}
运行结果为:
{"Name":"小黑"}
但是如果给出下面情况的赋值:
d := Dog{
Name: "小黑",
Variety: &Variety{Color: "black"},
}
运行结果为:
{"Name":"小黑","Variety":{"Color":"black","Category":""}}
可以看到,omitempty只对*Variety生效。所以想要嵌套结构体里面的字段也能有空值省略的效果,就要在定义嵌套的结构体的时候,对里面的每个字段都要加上omitempty选项。如下所示:
type Variety struct {
Color string `json:",omitempty"`
Category string `json:",omitempty"`
}
运行结果如下:
{"Name":"小黑","Variety":{"Color":"black"}}
剩下的最后一个坑就是:如果想要某个值就是为空(有实际意义),也就是说当一个空值有实际意义的时候就显示,没有实际意义(当时还不知道其值)的时候就不显示,这样的需求应该怎么做?如果还是向上面那样,当我们需要Category为空的时候(Category:“”),最后会发现omitempty选项会把这个空值字段省略。正确的做法是使用指针来定义其变量。最后代码如下:
package main
import (
"encoding/json"
"fmt"
)
type Variety struct {
Color *string `json:",omitempty"`
Category *string `json:",omitempty"`//一定要是*string类型
}
type Dog struct {
Name string
Weight int `json:",omitempty"`
Variety *Variety `json:",omitempty"`
}
func main() {
color := "black"
//此处的空值有实际意义
category := ""
d := Dog{
Name: "小黑",
Variety: &Variety{Color: &color, Category: &category},
}
marshalDog, err := json.Marshal(d)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(string(marshalDog))
}
运行结果如下:
{"Name":"小黑","Variety":{"Color":"black","Category":""}}
来源:https://blog.csdn.net/qq_54015483/article/details/130051713


猜你喜欢
- 一、需求描述web 自动化测试/python爬虫往往会遇到扫码登录的情况,不是所有的网站都支持用户密码登录,遇到这种扫码登录的情况会阻碍我们
- 当服务端对http的body进行解析到map[string]interface{}时,会出现cli传递的是int类型,而服务端只能断言成fl
- SQL Server所谓的分布式查询(Distributed Query)是能够访问存放在同一部计算机或不同计算机上的SQL Server或
- 要求:#出租车计费*************************************************************
- 一、引言网络上充满了窃听,我们的信息很容易被不怀好意的人获得,给我们造成不好的影响。如果你需要在网络上传输机密或者敏感的隐私信息,为了防备别
- mongodb是基于分布式文件存储的nosql(非关系型)数据库虽说是nosqldb, but mongodb 其中的文档可以是关系型的在m
- 301跳转通常用在网站换域名和为了保持链接统一性所用的。比如你原来的域名www.a.com现在换成www.b.com,用了301跳转后,访问
- 最近项目中的资产的任务状态频频出现问题,查看日志文件,看代码逻辑,也没发现什么具体的错误,总是过段时间就会出现一个表的字段没有更新的问题,很
- # 配置vuex和在vue中相同,只是mpvue有一个坑,就是不能直接在new Vue的时候传入store。步骤:1.在src目录下新建一个
- 从而达到方便快捷的目的,但是它在存储信息的时候往往会有一些敏感的东西,这些东西可能成为被攻击的目标,如银行的账号、信用卡事务或档案记录等。这
- 这篇文章主要介绍了Python函数参数类型及排序原理总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 好久没有弄JS了,因为我烦里边的大小写。其实和vbs差不多的,不过我看vbs毕竟应用面不广了,呵呵。var w=WScript.create
- 在做实验时,我们常常会使用用开源的数据集进行测试。而Pytorch中内置了许多数据集,这些数据集我们常常使用DataLoader类进行加载。
- 最近在接触一个Django项目,使用的是fbv( function-base views )模式,看起来特别不舒服,项目中有一个模型类117
- 本文的换肤方案灵感来自于 element-ui需求:网站换肤,主题切换。网站的主题色可以在几种常用颜色之间进行切换,还有相关图片、图标也要跟
- 本文实例讲述了Python 函数用法。分享给大家供大家参考,具体如下:demo.py(函数定义):# say_hello() # 不能在定义
- 记忆点:前序:VLR中序:LVR后序:LRV举例:一颗二叉树如下图所示:则它的前序、中序、后序遍历流程如下图所示:1.前序遍历class S
- python 如何获取文件夹中的全部文件在神经网络准备训练集的时候,经常需要从文件夹中读取全部图片。经常遇到的有两种方式1 os.listd
- 一.背景: 当数据量过大时,一个程序的执行时间就会主要花费在等待单次查询返
- 目录前言场景模拟总结前言近期多次聊到sql_mode的话题,也是多次遇到相关问题,今天就趁热打铁,再给大家带来一个sql_mode的案例分享