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

标签 json go struct field

这个结构的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/

相关文章:

swift - 如何从一组结构中检索出某个结构?

c++如何通过复制将结构 vector 复制到另一个结构 vector 中

go - 如何将文件模式转换为 int?

go - 在 CentOS 7 上将 Go 作为守护进程网络服务器运行

dictionary - 将值插入 map 时出现 panic /错误

C - "Error: Expected identifier or ' (' before ' [' token"

java - 解析从网站 Api 提取的 Json 代码中的数据时出现黑屏输出

json - 如何使用node.js仅获取嵌套JSON对象MongoDB的数据

javascript - 从 JSON 调用返回数组时遇到问题

ruby-on-rails - 简单的 Authlogic 问题 : JSON login?