golang中json的omitempty使用操作

 更新时间:2020年12月25日 08:34:27   作者:wilsonyx  
这篇文章主要介绍了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}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • 如何使用Go语言实现基于泛型的Jaccard相似度算法

    如何使用Go语言实现基于泛型的Jaccard相似度算法

    这篇文章主要介绍了如何使用Go语言实现基于泛型的Jaccard相似度算法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-08-08
  • Golang Gin框架获取请求参数的几种常见方式

    Golang Gin框架获取请求参数的几种常见方式

    在我们平常添加路由处理函数之后,就可以在路由处理函数中编写业务处理代码了,但在此之前我们往往需要获取请求参数,本文就详细的讲解下gin获取请求参数常见的几种方式,需要的朋友可以参考下
    2024-02-02
  • 用Go+Vue.js快速搭建一个Web应用(初级demo)

    用Go+Vue.js快速搭建一个Web应用(初级demo)

    这篇文章主要介绍了用Go+Vue.js快速搭建一个Web应用(初级demo),本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友参考下吧
    2017-11-11
  • 一文带你搞懂golang中内存分配逃逸分析

    一文带你搞懂golang中内存分配逃逸分析

    这篇文章主要带大家一起学习一下golang中内存分配逃逸分析,文中的示例代码讲解详细,对我们深入了解golang有一定的帮助,感兴趣的小伙伴可以了解下
    2023-08-08
  • 深入理解gorm如何和数据库建立连接

    深入理解gorm如何和数据库建立连接

    这篇文章主要为大家详细介绍了gorm如何和数据库建立连接,文中的示例代码讲解详细,对我们深入了解GO语言有一定的帮助,需要的小伙伴可以参考下
    2023-11-11
  • GoFrame代码优化gconv类型转换避免重复定义map

    GoFrame代码优化gconv类型转换避免重复定义map

    这篇文章主要为大家介绍了GoFrame代码优化gconv类型转换避免重复定义map示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 一文详解golang通过io包进行文件读写

    一文详解golang通过io包进行文件读写

    这篇文章主要介绍了golang通过io包进行文件读写文中有详细的代码示例。对学习或工资有很好的帮助,需要的小伙伴可以参考阅读一下
    2023-04-04
  • Golang HTML 模板使用指南示例详解

    Golang HTML 模板使用指南示例详解

    本文详细介绍了Golang HTML模板的使用方法,包括基础模板、高级模板、完整应用示例、CSS样式、JavaScript交互等,文章强调了模板组织、代码复用、语义化HTML、响应式设计、性能优化等最佳实践,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • golang解压带密码的zip包的方法详解

    golang解压带密码的zip包的方法详解

    ZIP 文件格式是一种常用的压缩和归档格式,用于将多个文件和目录打包到一个单独的文件中,同时对其内容进行压缩以减少文件大小,golang zip包的解压有官方的zip包(archive/zip),但是官方给的zip解压包代码只有解压不带密码的zip包,下面给出解压操作的封装
    2024-07-07
  • go时间/时间戳操作大全(小结)

    go时间/时间戳操作大全(小结)

    这篇文章主要介绍了go时间/时间戳操作大全,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07

最新评论