Вывести теги struct field field при демаршаллинге содержимого JSON для поля? - PullRequest
0 голосов
/ 25 августа 2018

В 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, это позволит мне разработать некоторую другую условную логику.

Возможно ли это?

1 Ответ

0 голосов
/ 25 августа 2018

Используйте отражение, чтобы получить значение тега struct field.Пакет 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)

}

. Вы можете получить значение только тех тегов поля, которые имеют их.Структурное поле отражает объект должен быть создан для извлечения тегов из его полей.

Рабочий код на Детская площадка

...