diff --git a/util/reflectutils/jsonfield.go b/util/reflectutils/jsonfield.go index 1132bbf..2f99466 100644 --- a/util/reflectutils/jsonfield.go +++ b/util/reflectutils/jsonfield.go @@ -47,6 +47,8 @@ type SStructFieldInfo struct { kebabFieldName string ForceString bool Tags map[string]string + + Aliases []string } func (s *SStructFieldInfo) updateTags(k, v string) { @@ -69,6 +71,9 @@ func (s SStructFieldInfo) deepCopy() *SStructFieldInfo { tags[k] = v } scopy.Tags = tags + aliases := make([]string, len(s.Aliases)) + copy(aliases, s.Aliases) + scopy.Aliases = aliases return &scopy } @@ -125,6 +130,9 @@ func ParseFieldJsonInfo(name string, tag reflect.StructTag) SStructFieldInfo { if !info.Ignore && len(info.Name) == 0 { info.Name = info.kebabFieldName } + if val, ok := info.Tags["alias"]; !info.Ignore && ok { + info.Aliases = strings.Split(val, ",") + } return info } @@ -336,6 +344,8 @@ func (fields SStructFieldValueSet) GetStructFieldIndexes2(name string, strictMod ret = append(ret, i) } else if info.FieldName == capName { ret = append(ret, i) + } else if len(info.Aliases) > 0 && utils.IsInArray(name, info.Aliases) { + ret = append(ret, i) } } } diff --git a/util/reflectutils/jsonfield_test.go b/util/reflectutils/jsonfield_test.go index abb312e..9f1ed68 100644 --- a/util/reflectutils/jsonfield_test.go +++ b/util/reflectutils/jsonfield_test.go @@ -455,3 +455,51 @@ func TestEmbededStructPtr(t *testing.T) { } } } + +func TestAliases(t *testing.T) { + type Struct1 struct { + Field1 string `json:"field1" alias:"field1_alias"` + } + type Struct2 struct { + Field2 string `json:"field2" alias:"field2_alias"` + } + type TopStruct struct { + Struct1 + Struct2 + } + + cases := []struct { + val interface{} + name string + index int + }{ + { + val: TopStruct{}, + name: "field1", + index: 0, + }, + { + val: TopStruct{}, + name: "field2", + index: 1, + }, + { + val: TopStruct{}, + name: "field1_alias", + index: 0, + }, + { + val: TopStruct{}, + name: "field2_alias", + index: 1, + }, + } + + for _, c := range cases { + set := FetchStructFieldValueSet(reflect.ValueOf(c.val)) + got := set.GetStructFieldIndex(c.name) + if got != c.index { + t.Errorf("Got: %v Want: %v", got, c.index) + } + } +}