この構造体の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"`
}
私はこの関数でフィールドを印刷しようとします:
func (b example) PrintFields() {
val := reflect.ValueOf(b)
for i := 0; i < val.Type().NumField(); i++ {
fmt.Println(val.Type().Field(i).Name)
}
}
もちろん私は得る:
Id
CreatedAt
Tag
Text
AuthorId
しかし、私は次のようなものが欲しいです:
id
created_at
tag
text
author_id
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"))
}
}
[〜#〜]注[〜#〜]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)
}
}
StructField
のName
を使用する代わりに、Tag
を使用してStructTag
オブジェクトを取得できます。参照: https://golang.org/pkg/reflect/#StructTag
次に、StructTag
のGet
または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"))
}
}
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)
}
}
}
使用する:
func (b example) PrintFields() {
val := reflect.ValueOf(b)
t := val.Type()
for i := 0; i < t.NumField(); i++ {
fmt.Println(t.Field(i).Tag.Get("json"))
}
}
playground。 で確認してください。
パラメーターとして汎用インターフェースを備えた更新バージョン:
func PrintFields(b interface{}) {
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 != "-" {
// check for possible comma as in "...,omitempty"
var commaIdx int
if commaIdx = strings.Index(jsonTag, ","); commaIdx < 0 {
commaIdx = len(jsonTag)
}
fieldName = jsonTag[:commaIdx]
}
fmt.Println(fieldName)
}
}
お探しのName
ではありません。あなたが探しているのはTag
です
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"))
}
}