hyzqb 发表于 2018-9-20 11:04:34

孤独风中一匹狼

1.通过tag反射  //
将结构体里的成员按照json名字来赋值  
func SetStructFieldByJsonName(ptr interface{}, fields mapinterface{}) {
  logger.Debug("fields:", fields)
  

  v := reflect.ValueOf(ptr).Elem() // the struct variable
  

  for i := 0; i < v.NumField(); i++ {
  

  fieldInfo := v.Type().Field(i) // a reflect.StructField
  tag := fieldInfo.Tag         // a reflect.StructTag
  name := tag.Get("json")
  

  if name == "" {
  name = strings.ToLower(fieldInfo.Name)
  }
  //去掉逗号后面内容 如 `json:"voucher_usage,omitempty"`
  name = strings.Split(name, ",")
  logger.Debug("JSONnAME:", name)
  

  if value, ok := fields; ok {
  

  logger.Debug("fieldInfo.Name:", fieldInfo.Name)
  //给结构体赋值
  //保证赋值时数据类型一致
  logger.Debug("类型1:", reflect.ValueOf(value).Type(), "类型2:", v.FieldByName(fieldInfo.Name).Type())
  if reflect.ValueOf(value).Type() == v.FieldByName(fieldInfo.Name).Type() {
  v.FieldByName(fieldInfo.Name).Set(reflect.ValueOf(value))
  }
  

  }
  }
  

  return
  
}


页: [1]
查看完整版本: 孤独风中一匹狼