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))
}
}
}