2016-11-29 18 views
6

Bu yapının json alan adlarını almanın yolu nedir?Golang'daki bir yapının json alan isimlerini nasıl alabilirim?

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

bu işlevle alanları yazdırmak için deneyin:

Id 
CreatedAt 
Tag 
Text 
AuthorId 

Ama şöyle bir şey istiyorum:: Tabii

func (b example) PrintFields() { 
    val := reflect.ValueOf(b) 
    for i := 0; i < val.Type().NumField(); i++ { 
     fmt.Println(val.Type().Field(i).Name) 
    } 
} 

alıyorum

id 
created_at 
tag 
text 
author_id 
+0

Kontrol (o etiket değerlerini almak için bir örnek içerir): [? Git etiketlerin kullanım (lar) nelerdir] (http://stackoverflow.com/ sorular/10858787/kullan-at-etiketleri-in-go/30889373 # 30889373) – icza

cevap

9

StructTag kullanıyorsunuz etiketleri almak için yazın. Ben bağlantılı dokümantasyon örnekleri, onları aramak vardır, ancak kod

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

Teşekkürler! Mükemmel çalışıyor! – lambher

2

Kullanım gibi bir şey olabilir:

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

yerine StructField 'ın Name kullanmanın playground.

4

Çalışırken görün, StructTag nesnesini almak için Tag'u kullanabilirsiniz. Bkz:

Get Kullanılması:

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 kullanma:

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

Değil https://golang.org/pkg/reflect/#StructTag

Sonra json etiketi almak için StructTag 'ın Get veya Lookup yöntem kullanabilirsiniz Name sen arıyorsun. Ne arayan bu cevap dışarı 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")) 
    } 
} 
İlgili konular