千家信息网

Go中JSON解析时tag怎么用

发表于:2024-10-20 作者:千家信息网编辑
千家信息网最后更新 2024年10月20日,这篇文章主要介绍"Go中JSON解析时tag怎么用"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Go中JSON解析时tag怎么用"文章能帮助大家解决问题。在处
千家信息网最后更新 2024年10月20日Go中JSON解析时tag怎么用

这篇文章主要介绍"Go中JSON解析时tag怎么用"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Go中JSON解析时tag怎么用"文章能帮助大家解决问题。

在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有反引号括起来的内容。形如:

 type User struct {     UserId   int    `json:"user_id" bson:"user_id"`     UserName string `json:"user_name" bson:"user_name"` }

struct成员变量标签(Tag)说明

要比较详细的了解这个,要先了解一下golang的基础,在golang中,命名都是推荐都是用驼峰方式,并且在首字母大小写有特殊的语法含义:包外无法引用。但是由经常需要和其它的系统进行数据交互,例如转成json格式,存储到mongodb啊等等。这个时候如果用属性名来作为键值可能不一定会符合项目要求。

所以呢就多了反引号的内容,在golang中叫标签(Tag),在转换成其它数据格式的时候,会使用其中特定的字段作为键值。例如上例在转成json格式:

 u := &User{UserId: 1, UserName: "tony"} j, _ := json.Marshal(u) fmt.Println(string(j))// 输出内容:// {"user_id":1,"user_name":"tony"}// 如果在属性中不增加标签说明,则输出:// {"UserId":1,"UserName":"tony"}// 可以看到直接用struct的属性名做键值。// ==其中还有一个bson的声明,这个是用在将数据存储到mongodb使用的==

struct成员变量标签(Tag)获取

那么当我们需要自己封装一些操作,需要用到Tag中的内容时,咋样去获取呢?这边可以使用反射包(reflect)中的方法来获取:完整代码如下:

package mainimport (    "encoding/json"    "fmt"    "reflect")func main() {    type User struct {        UserId   int    `json:"user_id" bson:"user_id"`        UserName string `json:"user_name" bson:"user_name"`    }    // 输出json格式    u := &User{UserId: 1, UserName: "tony"}    j, _ := json.Marshal(u)    fmt.Println(string(j))    // 输出内容:{"user_id":1,"user_name":"tony"}    // 获取tag中的内容    t := reflect.TypeOf(u)    field := t.Elem().Field(0)    fmt.Println(field.Tag.Get("json"))    // 输出:user_id    fmt.Println(field.Tag.Get("bson"))    // 输出:user_id}

自定义tag

 type User struct {     UserId   int    `json:"user_id" bson:"user_id" test:"test"`     UserName string `json:"user_name" bson:"user_name"` }

获取tag中test的值

// 获取tag中的内容typeof := reflect.TypeOf(u)field := typeof.Elem().Field(0)fmt.Println(field.Tag.Get("json"))// 输出:user_idfmt.Println(field.Tag.Get("bson"))// 输出:user_idfmt.Println(field.Tag.Get("test"))// 输出:test

关于"Go中JSON解析时tag怎么用"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

0