import ( "encoding/json" "fmt" "github.com/tidwall/gjson" "reflect" "strconv" "strings" ) type Param struct { SGameOpenId string GameId int Role struct { AreaId int PlatId int RoleId string } } func main() { requestStr := `{"fields":"{\"openid\":\"SGameOpenId\",\"role_id\":\"Role.RoleId\",\"gameid\":\"GameId\",\"area\":\"Role.AreaId\", \"platid\":\"Role.PlatId#1:10|0:20\"}"}` s := gjson.Get(requestStr, "fields").String() p := &Param{ SGameOpenId: "3375000136", GameId: 1191, Role: struct { AreaId int PlatId int RoleId string }{AreaId: 2, PlatId: 1, RoleId: "this role id"}, } getData(s, p) } type ProcessingWebParameters struct { dataMap map[string]interface{} } func getData(str string, req *Param) { var m map[string]interface{} json.Unmarshal([]byte(str), &m) dataMap := make(map[string]interface{}, 0) v := reflect.ValueOf(req) for s, i := range m { if sl := strings.Split(i.(string), "#"); len(sl) > 1 { // Role.PlatId#1:10|0:20 vv, k := actionStruct(sl[0], &v) vl := strings.Split(sl[1], "|") compareMap := make(map[string]string) for _, s2 := range vl { ev := strings.Split(s2, ":") compareMap[ev[0]] = ev[1] } // 判断目标类别 if k == reflect.Int { t := strconv.Itoa(vv.(int)) if value, ok := compareMap[t]; ok { dataMap[s], _ = strconv.Atoi(value) } } else if k == reflect.String { if value, ok := compareMap[vv.(string)]; ok { dataMap[s], _ = strconv.Atoi(value) } } } else { t, _ := actionStruct(i.(string), &v) dataMap[s] = t } } fmt.Println(dataMap) } func actionStruct(i string, v *reflect.Value) (interface{}, reflect.Kind) { var k reflect.Value if ss := strings.Split(i, "."); len(ss) > 1 { k = v.Elem().FieldByName(ss[0]).FieldByName(ss[1]) } else { k = v.Elem().FieldByName(i) } return getValue(&k), k.Kind() } func getValue(value *reflect.Value) interface{} { switch value.Kind() { case reflect.Int: return int(value.Int()) case reflect.String: return value.String() default: } return "" }
文章来源地址https://www.toymoban.com/news/detail-445163.html
文章来源:https://www.toymoban.com/news/detail-445163.html
到了这里,关于go利用反射获取string字符串对应的值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!