在自定义UnmarshallJson函数中使用对时间字段的反射

时间:2018-09-07 18:30:59

标签: go reflection

我正在尝试使用反射从结构中获取时间字段,并通过自定义的UnmarshallJSON函数获取时间字段,看看哪个遇到了时间。IsZero值,而哪些没有。它们以* time.Time的形式出现,我不想使用遗忘(我不能,并且需要这样清除和保留字段)。现在我正在逐个检查每个字段,但是我想知道是否有一种方法可以通过反射使它更健壮,如果添加了另一个时间字段,则不需要为此添加相应的检查。

现在这是我的工作方式:

type A struct {
    X *time.Time `json:"x"`
    Y *time.Time `json:"y"`

}

func (a *A) UnmarshalJSON(b []byte) (err error) {
    type Alias A
    s := &struct {
      X time.Time `json:"x"`
      Y time.Time `json:"y"`
}{
        Alias: (*Alias)(a),
    }
    if err := json.Unmarshal(b, &s); err != nil {
        return err
    }

if s.X.IsZero() {
        a.X = nil
    } else {
        a.X = &s.X
    }

if s.Y.IsZero() {
        a.Y = nil
    } else {
        a.Y = &s.Y
    }

我宁愿不必检查每个时间字段,而是要做类似的事情

values := reflect.ValueOf(&s).Elem()

for i := 0; i < values.NumField(); i++ {
    fieldName := values.Type().Field(i).Name
    fieldValue := values.Field(i).Interface()
    if fieldValue == nil {
        a.fieldName = nil
    } else {
      a.fieldName = &s.fieldName
    }

当我尝试执行a.fieldName或s.fieldName时出现问题,我缺少什么吗?有没有人遇到这个问题或(希望)解决了这个问题?

0 个答案:

没有答案