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

标签 go unmarshalling

在 Go 中,是否可以在我将 JSON 内容解码到结构字段时从结构字段中获取标签?这是我失败的尝试:

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 结构中获取标签的句柄,那将允许我开发一些其他条件逻辑。

这可能吗?

最佳答案

使用反射获取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)

}

您只能获取那些具有它们的字段标签的值。应创建结构字段反射对象以获取其字段的标签。

关于 Playground 的工作代码

关于go - 在解码字段的 JSON 内容时打印结构字段标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52020546/

相关文章:

amazon-web-services - 创建k8s资源并等待完成继续下一步

go - 当我的通配符参数中有双斜杠时,为什么 Gorilla mux 会重定向?

mongodb - 使用 mongodb/mongo-go-driver 和 Azure CosmosDB 的 ModifiedCount 和 MatchedCount 不正确

json - 在不知道结构的情况下解码嵌套的 json

java - Android 上的 SimpleXML 和反序列化时出错

go - go是否实现自己的ssl库?

go - 使用 gofmt 重构工具重命名全局变量

java解码LocalDateTime

java - 将 lombok 与 @XmlElement 一起使用

javax.xml.bind.UnmarshalException : unexpected element. 预期的元素是(无)