在 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/