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

lam*_*her 16 json struct field go

获取此结构的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"`
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用此功能打印字段:

func (b example) PrintFields() {
    val := reflect.ValueOf(b)
    for i := 0; i < val.Type().NumField(); i++ {
        fmt.Println(val.Type().Field(i).Name)
    }
}
Run Code Online (Sandbox Code Playgroud)

我当然得到:

Id
CreatedAt
Tag
Text
AuthorId
Run Code Online (Sandbox Code Playgroud)

但我想要的是:

id
created_at
tag
text
author_id
Run Code Online (Sandbox Code Playgroud)

ain*_*ain 20

您使用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"))
    }
}
Run Code Online (Sandbox Code Playgroud)

注:json标签格式支持不仅仅是字段名,如更多的omitempty还是string,所以如果你需要一个办法,需要的是照顾得,进一步改进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

        if jsonTag := t.Tag.Get("json"); jsonTag != "" && jsonTag != "-" {
            if commaIdx := strings.Index(jsonTag, ","); commaIdx > 0 {
                fieldName = jsonTag[:commaIdx]
            }
        }


        fmt.Println(fieldName)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`json` 标签不仅仅支持属性的名称,例如 `&lt;name&gt;,omitempty`,并且您的代码将无法通过返回的不仅仅是字段的名称。 (3认同)

jus*_*ius 5

您可以使用来获取对象,而不是使用StructField's 。请参阅:https : //golang.org/pkg/reflect/#StructTagNameTagStructTag

然后你可以使用StructTag'sGetLookup方法来获取 json 标签:

使用Get

func (b example) PrintFields() {
    val := reflect.ValueOf(b)
    for i := 0; i < val.Type().NumField(); i++ {
        // prints empty line if there is no json tag for the field
        fmt.Println(val.Type().Field(i).Tag.Get("json"))
    }
}
Run Code Online (Sandbox Code Playgroud)

使用Lookup

func (b example) PrintFields() {
    val := reflect.ValueOf(b)
    for i := 0; i < val.Type().NumField(); i++ {
        // skips fields without json tag
        if tag, ok := val.Type().Field(i).Tag.Lookup("json"); ok {
            fmt.Println(tag)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)