本文整理了一部分我们平时在项目中经常遇到的关于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使用内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!