2016-11-29 28 views
6

この構造体のjsonフィールド名を取得する方法は何ですか?golangで構造体の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 
+0

(それはタグの値を取得する例が含まれています)この答えをチェックアウトです/ 10858787/go-for-go-for-go/30889373#30889373) – icza

答えて

9

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")) 
    } 
} 
+0

ありがとう!それは完全に動作します! – lambher

2

使用のようなものが考えられます。

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.

4

代わりのStructFieldNameを使用して、それを参照してください。 Tagを使用してStructTagオブジェクトを取得できます。 を参照してください:https://golang.org/pkg/reflect/#StructTag

その後、あなたはJSON形式のタグを取得するStructTagGetまたはLookupメソッドを使用することができます。Lookupを使用して

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")) 
    } 
} 

Getを使用して

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) 
     } 
    } 
} 
1

ありませんあなたが探している10。 [?ゴーでのタグの使用(s)は何ですか](http://stackoverflow.com/:あなたが探して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")) 
    } 
} 
関連する問題