gin使用context

gin使用context.PostForm(“key”)无法获取到值

原因:

​ 有些场景使用context.BindJSON(&stru)函数虽然可以帮前台传入的json转换成struct结构,但是有些字段是不需要的(虽然理论上应该使用VO接收对象,但是为了方便起见就没有用VO)

​ 使用postman 用json or form格式提交均无法获取到key所对应的value

解决办法:

bm := make(map[string]interface{})
//将json参数绑定到map里面
context.BindJSON(&bm)
//然后需要struct 可把map转为json
// MapToStructDemo()


方法1:

func MapToStructDemo(){
        mapInstance := make(map[string]interface{})
        mapInstance["Name"] = "jqw"
        mapInstance["Age"] = 18
 
        var people People
        err := mapstructure.Decode(mapInstance, &people)
        if err != nil {
                fmt.Println(err)
        }
        fmt.Println(people)
}	

方法2:


/**
将map转为struct
 */
func MapToStruct(m map[string]interface{} , pointer interface{})  {
	/*err := mapstructure.Decode(a, &b)
	if err != nil {
		panic(err)
	}*/

	// reflect.Ptr类型 *main.Person
	pointertype := reflect.TypeOf(pointer)
	// reflect.Value类型
	pointervalue := reflect.ValueOf(pointer)
	// struct类型  main.Person

	structType := pointertype.Elem()
	// 遍历结构体字段
	for i := 0; i < structType.NumField(); i++ {
		// 获取指定字段的反射值
		f := pointervalue.Elem().Field(i)
		//获取struct的指定字段
		stf := structType.Field(i)
		// 获取tag
		/*fmt.Println(stf.Tag.Get("json"))
		if splitS := strings.Split(stf.Tag.Get("json:"), ",") ; len(splitS) >0 && splitS[0] != "" {

			strings.Trim(splitS[0]," ")
		}*/

		name := strings.Split(stf.Tag.Get("json"), ",")[0]
		// 判断是否为忽略字段
		if name == "-" {
			continue
		}
		// 判断是否为空,若为空则使用字段本身的名称获取value值
		if name == "" {
			name =strings.ToLower( stf.Name)
		}
		//获取value值
		v, ok := m[name]
		if !ok {
			continue
		}

		//获取指定字段的类型
		kind := pointervalue.Elem().Field(i).Kind()
		// 若字段为指针类型
		if kind == reflect.Ptr {
			// 获取对应字段的kind
			kind = f.Type().Elem().Kind()
		}
		// 设置对应字段的值
		switch kind {
		case reflect.Int:
			res, _ := strconv.ParseInt(fmt.Sprint(v), 10, 64)
			pointervalue.Elem().Field(i).SetInt(res)

		case reflect.String:
			pointervalue.Elem().Field(i).SetString(fmt.Sprint(v))
		}
	}
}

你可能感兴趣的:(gin)