golang中json的omitempty使用操作
作者:wilsonyx 发布时间:2024-05-13 09:06:44
标签:golang,json,omitempty
我就废话不多说了,大家还是直接看代码吧~
package main
import (
"encoding/json"
"fmt"
)
type Project struct {
Name string `json:"name"`
Url string `json:"url"`
Docs string `json:"docs,omitempty"`
}
func main() {
p1 := Project{
Name:"hello name",
Url:"https://blog.csdn.net/qq_30505673",
}
data, err := json.Marshal(p1)
if err != nil {
panic(err)
}
// Docs定义为omitempty所以不会出现Docs的字段
fmt.Printf("%s\n", data)
p2 := Project{
Name:"lovego",
Url:"https://blog.csdn.net/qq_30505673",
Docs:"https://blog.csdn.net/qq_30505673",
}
data2, err := json.Marshal(p2)
if err != nil {
panic(err)
}
//打印出所有的字段
fmt.Printf("%s\n", data2)
}
如果没有omitempty,该字段是会显示的。
补充:golang omitempty实现嵌套结构体的省略输出
golang在处理json转换时,对于标签omitempty定义的field,如果给它赋得值恰好等于空值(比如:false、0、""、nil指针、nil接口、长度为0的数组、切片、映射),则在转为json之后不会输出这个field。
那么,针对结构体中嵌套结构体,如果嵌套结构体为空,是否也会忽略?如果要忽略空结构体输出,怎么处理?
情况一:匿名结构体:使用omitempty修饰该匿名结构体中的字段,那么当为空时不会输出
type Book struct{
Name string `json:"name"`
Price float32 `json:"price"`
Desc string `json:"desc,omitempty"`
Author //匿名结构体
}
type Author struct {
Gender int `json:"gender,omitempty"`
Age int `json:"age,omitempty"`
}
func main() {
var book Book
book.Name = "testBook"
bookByte,_:=json.Marshal(book)
fmt.Printf("%s\n", string(bookByte))
}
输出:
{"name":"testBook","price":0}
情况二:非匿名结构体
type Book struct{
Name string `json:"name"`
Price float32 `json:"price"`
Desc string `json:"desc,omitempty"`
Author Author `json:"author,omitempty"`
}
type Author struct {
Gender int `json:"gender,omitempty"`
Age int `json:"age,omitempty"`
}
func main() {
var book Book
book.Name = "testBook"
bookByte,_:=json.Marshal(book)
fmt.Printf("%s\n", string(bookByte))
}
输出:
{"name":"testBook","price":0,"author":{}}
可以发现,没有给嵌套结构体赋值时,会打印该嵌套结构体的空结构体。这是因为该空结构体不属于omitempty能识别的空值(false、0、""、nil指针、nil接口、长度为0的数组、切片、映射)。但若期望该嵌套结构体的空结构体也不会输出,可以通过指针实现。
type Book struct{
Name string `json:"name"`
Price float32 `json:"price"`
Desc string `json:"desc,omitempty"`
Author *Author `json:"author,omitempty"`
}
type Author struct {
Gender int `json:"gender"`
Age int `json:"age"`
}
func main() {
var book Book
book.Name = "testBook"
bookByte,_:=json.Marshal(book)
fmt.Printf("%s\n", string(bookByte))
}
输出:
{"name":"testBook","price":0}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持asp之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://blog.csdn.net/qq_30505673/article/details/87804194


猜你喜欢
- 数据库快照是怎样工作的可以使用典型的数据库命令CREATE DATABASE语句来生成一个数据库快照,在声明中有一个源数据库快照的附加说明。
- REPLACE语法REPLACE(String,from_str,to_str)即:将String中所有出现的from_str替换为to_s
- 1.相关基础python3中有两种字符串类型:str和bytespython编码问题可以参考文章str以unicode编码格式保存在内存所以
- 背景喵哥想在MFC中调用python脚本,在原来的代码中包含一个只支持x86的库文件(超级核心的文件),原本安装的python是x64的,强
- 之前遇到过一类问题,要求快速做文件搜索,当时小编找了很多内容,但是没有发现实现方法,突然看到glob模块便豁然开朗了,该模块主要就是能够实现
- Golang 复制文件夹,包括文件夹中的文件/** * 拷贝文件夹,同时拷贝文件夹中的文件 * @param srcPath 需要拷贝的文件
- 前言网站登录的时候我们常常会看到随机的验证码需要输入后台验证,如图:现在我们来实现在Django中通过自定制插件来实现随机验证check_c
- Python json 错误xx is not JSON serializable解决办法在使用json的时候经常会遇到xxx
- 随机生成四位数验证码,包括汉字,数字,英文大小写。1.Servlet类package servlet;import java.awt.Bas
- 过去一段时间人们似乎又非常热衷于探讨网络文档的印刷格式,涌现了很多与之相关的技术与理论资料,其中相当重要的一个领域就是关于印刷中字号和行高的
- 连接配置方式如图:有时候Navicat并没有初始化安装sqlncli, 所以连接的时候会报 没有默认驱动,如图:解决方法:在navicat目
- 在Python中,有些开源项目中的方法返回结果为self. 对于不熟悉这种用法的读者来说,这无疑使人困扰,本文的目的就是给出这种语法的一个解
- 1、返回json响应结果在struct的字段后面加入json:"key"可以进行json格式输出,其中key为json的
- 这篇文章主要介绍了Python os模块常用方法和属性总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 本文实例为大家分享了python3实现多张图片附件邮件发送的具体代码,供大家参考,具体内容如下直接上代码,没有注释!from email.m
- python函数式编程之装饰器1.开放封闭原则简单来说,就是对扩展开放,对修改封闭。在面向对象的编程方式中,经常会定义各种函数。一个函数的使
- python中使用pip安装扩展包的时候,有时候会遇到如下类似报错:Running setup.py install for mysqlcl
- 在我们常用的系统windows和Linux系统中有很多支持的压缩包格式,包括但不限于以下种类:rar、zip、tar,以下的标准库的作用就是
- 一、time时间模块import time1 、时间戳:time.time()时间戳(timestamp):时间戳表示的是从1970年1月1
- 一、问题描述在windows下,time.Parse()的时区和time.Format()的时区是一致的。但是在linux环境下,time.