如何在Golang中获取结构的json字段名称? [英] How to get the json field names of a struct in golang?

查看:21
本文介绍了如何在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标记格式支持的不仅仅是字段名称,如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)
    }
  }
}

这篇关于如何在Golang中获取结构的json字段名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆