在解组字段的JSON内容时打印结构字段标签?

时间:2018-08-25 19:21:36

标签: go unmarshalling

在Go中,当我将JSON内容编组到struct字段时,是否可以从struct字段获取标签?这是我这样做的失败尝试:

package main
import (
  "log"
  "encoding/json"
)
type Person struct {
  ProfileName AltField `json:"profile_name"`
}

type AltField struct {
  Val string
}

func (af *AltField) UnmarshalJSON(b []byte) error {
  log.Println("Show tags")
  //log.Println(af.Tag) // I want to see `json:"profile_name"`
  if e := json.Unmarshal(b,&af.Val); e != nil {
    return e
  }
  return nil
}
func main() {
  p := Person{}
  _ = json.Unmarshal([]byte(`{"profile_name":"Af"}`),&p)

}

我注释了log.Println(af.Tag)行,因为它会导致编译错误。如果我可以从Person结构中获得标记的句柄,那将使我能够开发其他条件逻辑。

这可能吗?

1 个答案:

答案 0 :(得分:1)

使用反射获取struct字段标签的值。 reflect软件包提供了与标签一起使用的功能,包括获取标签的值

package main

import (
  "log"
  "encoding/json"
  "reflect"
)
type Person struct {
  ProfileName AltField `json:"profile_name"`
}

type AltField struct {
  Val string `json:"val"`
}

func (af *AltField) UnmarshalJSON(b []byte) error {
  field, ok := reflect.TypeOf(*af).FieldByName("Val")
  if !ok {
    panic("Field not found")
  }
  log.Println(string(field.Tag))

  if e := json.Unmarshal(b,&af.Val); e != nil {
    return e
  }
  return nil
}

func main() {
  p := Person{}
  _ = json.Unmarshal([]byte(`{"profile_name":"Af"}`),&p)

}

您只能获取具有它们的那些字段标签的值。应该创建struct字段reflect对象,以获取其字段的标签。

Playground上的工作代码