diff --git a/util/json.go b/util/json.go index f5631167..57424a91 100644 --- a/util/json.go +++ b/util/json.go @@ -14,7 +14,10 @@ package util -import "encoding/json" +import ( + "encoding/json" + "reflect" +) func StructToJson(v interface{}) string { data, err := json.Marshal(v) @@ -37,3 +40,30 @@ func StructToJsonFormatted(v interface{}) string { func JsonToStruct(data string, v interface{}) error { return json.Unmarshal([]byte(data), v) } + +func TryJsonToAnonymousStruct(j string) (interface{}, error) { + var data map[string]interface{} + if err := json.Unmarshal([]byte(j), &data); err != nil { + return nil, err + } + + // Create a slice of StructFields + fields := make([]reflect.StructField, 0, len(data)) + for k, v := range data { + fields = append(fields, reflect.StructField{ + Name: k, + Type: reflect.TypeOf(v), + }) + } + + // Create the struct type + t := reflect.StructOf(fields) + + // Unmarshal again, this time to the new struct type + val := reflect.New(t) + i := val.Interface() + if err := json.Unmarshal([]byte(j), &i); err != nil { + return nil, err + } + return i, nil +} diff --git a/util/string.go b/util/string.go index 91eedf89..46f0af6d 100644 --- a/util/string.go +++ b/util/string.go @@ -324,9 +324,16 @@ func GetUsernameFromEmail(email string) string { } func StringToInterfaceArray(array []string) []interface{} { - var interfaceArray []interface{} - for _, v := range array { - interfaceArray = append(interfaceArray, v) + var ( + interfaceArray []interface{} + elem interface{} + ) + for _, elem = range array { + jStruct, err := TryJsonToAnonymousStruct(elem.(string)) + if err == nil { + elem = jStruct + } + interfaceArray = append(interfaceArray, elem) } return interfaceArray }