广告
返回顶部
首页 > 资讯 > 后端开发 > GO >详解go语言json的使用技巧
  • 791
分享到

详解go语言json的使用技巧

json的使用JSONGO技巧 2022-06-07 20:06:01 791人浏览 安东尼
摘要

本文整理了一部分我们平时在项目中经常遇到的关于Go语言JSON数据与结构体之间相互转换的问题及解决办法。 基本的序列化 首先我们来看一下Go语言中json.Marshal()

本文整理了一部分我们平时在项目中经常遇到的关于Go语言JSON数据与结构体之间相互转换的问题及解决办法。

基本的序列化

首先我们来看一下Go语言中json.Marshal()(系列化)与json.Unmarshal(反序列化)的基本用法。


type Person struct {
 Name  string
 Age  int64
 Weight float64
}
func main() {
 p1 := Person{
 Name:  "小明",
 Age:  18,
 Weight: 71.5,
 }
 // struct -> json string
 b, err := json.Marshal(p1)
 if err != nil {
 fmt.Printf("json.Marshal failed, err:%v\n", err)
 return
 }
 fmt.Printf("str:%s\n", b)
 // json string -> struct
 var p2 Person
 err = json.Unmarshal(b, &p2)
 if err != nil {
 fmt.Printf("json.Unmarshal failed, err:%v\n", err)
 return
 }
 fmt.Printf("p2:%#v\n", p2)
}

输出:
str:{"Name":"小明","Age":18,"Weight":71.5}
p2:main.Person{Name:"小明", Age:18, Weight:71.5}

结构体tag介绍

Tag是结构体的元信息,可以在运行的时候通过反射的机制读取出来。 Tag在结构体字段的后方定义,由一对反引号包裹起来,具体的格式如下:


`key1:"value1" key2:"value2"`

结构体tag由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。
同一个结构体字段可以设置多个键值对tag,不同的键值对之间使用空格分隔。

使用json tag指定字段名

序列化与反序列化默认情况下使用结构体的字段名,我们可以通过给结构体字段添加tag来指定json序列化生成的字段名。


// 使用json tag指定序列化与反序列化时的行为
type Person struct {
 Name  string `json:"name"` // 指定json序列化/反序列化时使用小写name
 Age  int64
 Weight float64
}
忽略某个字段

如果你想在json序列化/反序列化的时候忽略掉结构体中的某个字段,可以按如下方式在tag中添加-。


// 使用json tag指定json序列化与反序列化时的行为
type Person struct {
 Name  string `json:"name"` // 指定json序列化/反序列化时使用小写name
 Age  int64
 Weight float64 `json:"-"` // 指定json序列化/反序列化时忽略此字段
}
忽略空值字段

当 struct 中的字段没有值时, json.Marshal() 序列化的时候不会忽略这些字段,而是默认输出字段的类型零值(例如int和float类型零值是 0,string类型零值是"",对象类型零值是 nil)。如果想要在序列序列化时忽略这些没有值的字段时,可以在对应字段添加omitempty tag。

举个例子:


type User struct {
 Name string  `json:"name"`
 Email string  `json:"email"`
 Hobby []string `json:"hobby"`
}
func omitemptyDemo() {
 u1 := User{
 Name: "小明",
 }
 // struct -> json string
 b, err := json.Marshal(u1)
 if err != nil {
 fmt.Printf("json.Marshal failed, err:%v\n", err)
 return
 }
 fmt.Printf("str:%s\n", b)
}

输出结果:
str:{"name":"小明","email":"","hobby":null}

如果想要在最终的序列化结果中去掉空值字段,可以像下面这样定义结构体:


// 在tag中添加omitempty忽略空值
// 注意这里 hobby,omitempty 合起来是json tag值,中间用英文逗号分隔
type User struct {
 Name string  `json:"name"`
 Email string  `json:"email,omitempty"`
 Hobby []string `json:"hobby,omitempty"`
}

此时,再执行上述的omitemptyDemo,输出结果如下:

str:{"name":"小明"} // 序列化结果中没有email和hobby字段

说句题外话,我们使用gORM操作数据库的话,经常会遇到想忽略指定字段修改的问题,比如结构体中的关联实体,只想json展示,form提交时忽略实体,这种问题我会单独整理一篇出来。

忽略嵌套结构体空值字段

首先来看几种结构体嵌套的示例:


type User struct {
 Name string  `json:"name"`
 Email string  `json:"email,omitempty"`
 Hobby []string `json:"hobby,omitempty"`
 Profile
}
type Profile struct {
 WEBsite string `json:"site"`
 Slogan string `json:"slogan"`
}
func nestedStructDemo() {
 u1 := User{
 Name: "小明",
 Hobby: []string{"足球", "篮球"},
 }
 b, err := json.Marshal(u1)
 if err != nil {
 fmt.Printf("json.Marshal failed, err:%v\n", err)
 return
 }
 fmt.Printf("str:%s\n", b)
}

匿名嵌套Profile时序列化后的json串为单层的:

str:{"name":"小明","hobby":["足球","蓝球"],"site":"","slogan":""}

想要变成嵌套的json串,需要改为具名嵌套或定义字段tag:


type User struct {
 Name  string  `json:"name"`
 Email  string  `json:"email,omitempty"`
 Hobby  []string `json:"hobby,omitempty"`
 Profile `json:"profile"`
}
// str:{"name":"小明","hobby":["足球","篮球"],"profile":{"site":"","slogan":""}}

想要在嵌套的结构体为空值时,忽略该字段,仅添加omitempty是不够的:


type User struct {
 Name   string  `json:"name"`
 Email  string  `json:"email,omitempty"`
 Hobby  []string `json:"hobby,omitempty"`
 Profile `json:"profile,omitempty"`
}
// str:{"name":"小明","hobby":["足球","篮球"],"profile":{"site":"","slogan":""}}

还需要使用嵌套的结构体指针:


type User struct {
 Name   string  `json:"name"`
 Email  string  `json:"email,omitempty"`
 Hobby  []string `json:"hobby,omitempty"`
 *Profile `json:"profile,omitempty"` //这里是重点
}
// str:{"name":"小明","hobby":["足球","篮球"]}
不修改原结构体忽略空值字段

我们需要json序列化User,但是不想把密码也序列化,又不想修改User结构体,这个时候我们就可以使用创建另外一个结构体PublicUser匿名嵌套原User,同时指定PassWord字段为匿名结构体指针类型,并添加omitemptytag,示例代码如下:


type User struct {
 Name   string `json:"name"`
 Password string `json:"password"`
}
type PublicUser struct {
 *User       // 匿名嵌套
 Password *struct{} `json:"password,omitempty"`
}
func omitPasswordDemo() {
 u1 := User{
 Name:   "小明",
 Password: "123456",
 }
 b, err := json.Marshal(PublicUser{User: &u1})
 if err != nil {
 fmt.Printf("json.Marshal u1 failed, err:%v\n", err)
 return
 }
 fmt.Printf("str:%s\n", b) // str:{"name":"小明"}
}
优雅处理字符串格式的数字

有时候,前端在传递来的json数据中可能会使用字符串类型的数字,这个时候可以在结构体tag中添加string来告诉json包从字符串中解析相应字段的数据:


type Card struct {
 ID  int64  `json:"id,string"`  // 添加string tag
 Score float64 `json:"score,string"` // 添加string tag
}
func intAndStringDemo() {
 jsonStr1 := `{"id": "1234567","score": "88.50"}`
 var c1 Card
 if err := json.Unmarshal([]byte(jsonStr1), &c1); err != nil {
 fmt.Printf("json.Unmarsha jsonStr1 failed, err:%v\n", err)
 return
 }
 fmt.Printf("c1:%#v\n", c1) // c1:main.Card{ID:1234567, Score:88.5}
}
总结

今天只是整理了一部分json的使用技巧,在实际项目中json是不可缺少的一个组成部分,今天立个flag,下一篇会整理gorm相关的使用技巧。

到此这篇关于详解go语言json的使用技巧的文章就介绍到这了,更多相关go语言json使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!


您可能感兴趣的文档:

--结束END--

本文标题: 详解go语言json的使用技巧

本文链接: https://www.lsjlt.com/news/30662.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解go语言json的使用技巧
    本文整理了一部分我们平时在项目中经常遇到的关于go语言JSON数据与结构体之间相互转换的问题及解决办法。 基本的序列化 首先我们来看一下Go语言中json.Marshal()...
    99+
    2022-06-07
    json的使用 JSON GO 技巧
  • Go语言JSON解析器gjson使用方法详解
    目录gjson安装使用gjson GJSON 是一个Go包,它提供了一种从json文档中获取值的快速简单的方法。它具有单行检索、点符号路径、迭代和解析 json 行等功能。 还可以查...
    99+
    2022-12-08
    Go 解析器gjson Go JSON解析器
  • Go语言实现JSON解析的方法详解
    目录1、json序列化2、Json反序列化为结构体对象3、Json反序列化为map类型4、Tag的使用在日常项目中,使用Json格式进行数据封装是比较常见的操作,看一下golang怎...
    99+
    2022-11-13
  • Go语言实现JSON解析的神器详解
    目录前言JSON解析实践标准库encoding/json第三方库json-iterator收集到开源项目jinzaigo/xutil中总结前言 php转go是大趋势,越来越多公司的p...
    99+
    2023-01-29
    Go语言解析JSON Go 解析JSON Go语言 JSON
  • Go 语言 json解析框架与 gjson 详解
    目录1. 快速使用2. Get() 返回的 Result 结构体3. 键路径4. json 数组遍历5. 其他前言: JSON 解析是我们不可避免的常见问题,在 Go 语言中,我们可...
    99+
    2022-11-11
  • Go 语言 JSON 标准库的使用
    目录序列化1. 结构体序列化2. 字典序列化3. 切片序列化反序列化1. 明确知道 JSON 格式2. 无法确定 JSON 格式Go 语言中的 encoding/json 库提供了复...
    99+
    2022-11-12
  • Go语言JSON解析器gjson如何使用
    今天小编给大家分享一下Go语言JSON解析器gjson如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。gjsonGJS...
    99+
    2023-07-04
  • Windows 环境下的 Go 语言开发技巧:数组操作详解!
    作为一种高效、可靠的编程语言,Go 语言在近年来得到了越来越多的关注和使用。而数组是 Go 语言中最基础的数据结构之一,也是最为常用的数据类型之一。在本文中,我们将详细介绍在 Windows 环境下使用 Go 语言进行数组操作的技巧和注意...
    99+
    2023-06-20
    数组 开发技术 windows
  • 优化Go语言内存使用的几种技巧
    优化Go语言内存使用的几种技巧可以包括以下几个方面:1. 使用指针传递:Go语言中的函数参数传递都是值传递,如果传递大的结构体或者数...
    99+
    2023-10-08
    Golang
  • Go语言中sync.Cond使用详解
    目录sync.Cond 可以用来干什么? 与 Sync.Mutex 的区别 sync.Cond 使用场景 sync.Cond sync.Cond 有哪些方法 NewCond 创建实例...
    99+
    2022-11-12
  • 详解Go语言中结构体与JSON间的转换
    目录前言结构体转 JSONJSON 解析结构体小结前言 在日常开发中,我们往往会将 JSON 解析成对应的结构体,反之也会将结构体转成 JSON。接下来本文会通过 JSON 包的两个...
    99+
    2022-12-14
    Go语言 结构体 JSON转换 Go语言 结构体 JSON Go语言结构体 Go语言 JSON
  • Go语言中interface语法与使用详解
    目录初识interface基本语法其他注意事项interface底层实现ifaceeface侵入式与非侵入式的理解interface的应用场景类型转换实现多态功能补充:interfa...
    99+
    2022-11-13
  • Go语言学习之JSON编码解析与使用
    目录1.Map转JSON2. Json转Map3.结构体转JSON3.1 无字段标签3.2 有字段标签3.3 匿名字段4.JSON转结构体5.切片转JSON6.JSON转切片1.Ma...
    99+
    2023-02-14
    Go语言JSON解析 Go语言JSON使用 Go JSON
  • 解密Go语言项目开发的秘诀与技巧
    Go是一门年轻的编程语言,其简洁高效的特点使得越来越多的开发者选择使用它进行项目开发。但是,对于初学者来说,Go语言的语法与开发方式与其他编程语言有所不同,因此掌握一些实用的技巧和秘诀会在项目开发中提高效率和编程水平。一、选择合适的框架框架...
    99+
    2023-11-03
    技巧 Go语言 项目开发
  • 解决Go语言Websocket连接频繁断开的技巧
    随着Web应用程序的流行,WebSocket作为最常用的通信协议之一,往往被用于客户端与服务器之间的实时通信。在Go语言中, gorilla/websocket 是使用WebSocket的最受欢迎的第三方库之一。但是,通过使用WebSock...
    99+
    2023-12-14
    技巧 Go语言 websocket
  • Go语言中数组索引的使用技巧有哪些?
    在Go语言中,数组是一种常见的数据结构。数组可以存储一组相同类型的数据,而数组索引则是数组中每个元素的唯一标识符。在本文中,我们将探讨一些在Go语言中使用数组索引的技巧。 遍历数组 在Go语言中,遍历数组是一种常见的操作。我们可以使用...
    99+
    2023-11-06
    索引 数组 存储
  • 快速掌握Go语言中使用NumPy对象的技巧
    Go语言是一种强类型编程语言,它的语法简单易懂,同时还拥有快速编译和高效运行的特点。在Go语言中,使用NumPy对象可以帮助我们更加高效地进行科学计算和数据分析。本文将介绍如何,并且会穿插一些演示代码。 导入NumPy包 在使用NumP...
    99+
    2023-08-28
    numpy 对象 教程
  • 详解C语言中二分查找的运用技巧
    目录基础的二分查查找左侧边界查找右侧边界二分查找问题分析实例1: 爱吃香蕉的珂珂实例2:运送包裹前篇文章聊到了二分查找的基础以及细节的处理问题,主要介绍了 查找和目标值相等的元素、查...
    99+
    2022-11-13
  • 详解Go语言中单链表的使用
    目录链表单链表结构创建节点遍历链表头插法尾插法遍历方法链表长度链表转数组数组转链表链表 一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的...
    99+
    2022-11-11
  • Go语言时间处理必备技巧全解析
    目录1. 时间的表示2. 时间的计算3. 时间的比较4. 定时器和 Ticker5. 时区和时间格式化6. 定时任务7. 总结1. 时间的表示 Go 语言中时间的表示方式是通过 ti...
    99+
    2023-05-18
    Go语言时间处理技巧 Go语言时间处理 Go 时间处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作