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功能应进行:
json标签是否-(即json:"-")像这样的东西:
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)
您可以使用来获取对象,而不是使用StructField's 。请参阅:https : //golang.org/pkg/reflect/#StructTagNameTagStructTag
然后你可以使用StructTag'sGet或Lookup方法来获取 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)
| 归档时间: |
|
| 查看次数: |
10517 次 |
| 最近记录: |