如何在Golang中获取结构的json字段名称? [英] How to get the json field names of a struct in golang?
本文介绍了如何在Golang中获取结构的json字段名称?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
获取此结构的json字段名称的方法是什么?
type example struct {
Id int `json:"id"`
CreatedAt string `json:"created_at"`
Tag string `json:"tag"`
Text string `json:"text"`
AuthorId int `json:"author_id"`
}
我尝试使用此函数打印字段:
func (b example) PrintFields() {
val := reflect.ValueOf(b)
for i := 0; i < val.Type().NumField(); i++ {
fmt.Println(val.Type().Field(i).Name)
}
}
我当然会收到:
Id
CreatedAt
Tag
Text
AuthorId
但是我想要这样的东西:
id
created_at
tag
text
author_id
推荐答案
使用StructTag类型获取标记。我链接的文档包含示例,请查找它们,但您的代码可能类似于
func (b example) PrintFields() {
val := reflect.ValueOf(b)
for i := 0; i < val.Type().NumField(); i++ {
fmt.Println(val.Type().Field(i).Tag.Get("json"))
}
}
注意json
标记格式支持的不仅仅是字段名称,如omitempty
或string
,因此如果您也需要一种能够解决这一问题的方法,则应进一步改进PrintFields
函数:
- 我们需要检查
json
标签是否为-
(即json:"-"
) - 我们需要检查名称是否存在并将其隔离
如下所示:
func (b example) PrintFields() {
val := reflect.ValueOf(b)
for i := 0; i < val.Type().NumField(); i++ {
t := val.Type().Field(i)
fieldName := t.Name
switch jsonTag := t.Tag.Get("json"); jsonTag {
case "-":
case "":
fmt.Println(fieldName)
default:
parts := strings.Split(jsonTag, ",")
name := parts[0]
if name == "" {
name = fieldName
}
fmt.Println(name)
}
}
}
这篇关于如何在Golang中获取结构的json字段名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文