gpt4 book ai didi

json - 如何在golang中获取结构的json字段名称?

转载 作者:IT老高 更新时间:2023-10-28 13:05:33 25 4
gpt4 key购买 nike

这个结构的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"))
}
}

NOTE json 标签格式支持的不仅仅是字段名称,例如 omitemptystring,所以如果您也需要一种处理该问题的方法,则应进一步改进 PrintFields 函数:

  1. 我们需要检查json标签是否为-(即json:"-")
  2. 我们需要检查名称是否存在并将其隔离

类似这样的:

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)
}
}
}

关于json - 如何在golang中获取结构的json字段名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40864840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com