欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解go语言json的使用技巧

程序员文章站 2022-04-09 12:01:45
本文整理了一部分我们平时在项目中经常遇到的关于go语言json数据与结构体之间相互转换的问题及解决办法。基本的序列化首先我们来看一下go语言中json.marshal()(系列化)与json.unma...

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

基本的序列化

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

输出:
str:{"name":"小明","age":18,"weight":71.5}
p2:main.person{name:"小明", age:18, weight:71.5}

结构体tag介绍

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

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

使用json tag指定字段名

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

忽略某个字段

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

忽略空值字段

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

举个例子:

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

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

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

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

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

忽略嵌套结构体空值字段

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

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

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

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

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

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

不修改原结构体忽略空值字段

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

优雅处理字符串格式的数字

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

总结

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

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

相关标签: go语言 json