Posted
技术标签:
【中文标题】Golang 将 form-urlencoded 序列化为对象【英文标题】:Golang serialize form-urlencoded to object 【发布时间】:2022-01-15 12:19:57 【问题描述】:我发出了一个发布请求,我将数据作为 JSON 发送,这段代码在数据库中创建了一个新行。
json.NewDecoder(r.Body).Decode(&user)
DB.Create(&user)
json.NewEncoder(w).Encode(user)
但是解析表单数据显示这个错误 我想这就是我读取每个单独值的方式
for key, value := range r.PostForm
fmt.Printf("Key:%s, Value:%s\n", key, value)
我的模型是这样的
type User struct
gorm.Model
FirstName string `json:"firstname"`
LastName string `json:"lastname"`
Email string `json:"email"`
如何将其转换为用户并插入数据库?
【问题讨论】:
json.NewDecoder(r.Body).Decode(&user)
application/x-www-form-urlencoded
u.FirstName = r.FormValue("firstname")
需要解析一个 URL 编码的表单给用户
***.com/questions/44052311/…
【参考方案1】:
r.FormValuer.FormValue("firstname")
func handleUser(w http.ResponseWriter, r *http.Request)
user := User
userType := reflect.TypeOf(user)
for i := 0; i < userType.NumField(); i++
// Get the JSON tag of the field, use it for the r.FormValue
f := userType.Field(i).Tag.Get("json")
if f != ""
reflect.ValueOf(&user).Elem().FieldByName(
userType.Field(i).Name).SetString(r.FormValue(f))
// DB.Create(&user) need a reference to DB here.
json.NewEncoder(w).Encode(user)
SetStringFieldByName(...
正如 Cerise Limón 指出的那样,正确的做法是
func handleUser(w http.ResponseWriter, r *http.Request)
user := User
user.FirstName = r.FormValue("firstname")
user.LastName = r.FormValue("lastname")
user.Email = r.FormValue("email")
// DB.Create(&user) need a reference to DB here.
json.NewEncoder(w).Encode(user)
请注意,如果您在多个地方执行此操作,您还可以添加一个使用表单填充用户的方法,例如
func (u *User) setFormData(r *http.Request)
u.FirstName = r.FormValue("firstname")
u.LastName = r.FormValue("lastname")
u.Email = r.FormValue("email")
然后像这样使用它
func handleUser(w http.ResponseWriter, r *http.Request)
user := User
user.setFormData(r)
// DB.Create(&user)
json.NewEncoder(w).Encode(user)
【讨论】:
以上是关于Golang 将 form-urlencoded 序列化为对象的主要内容,如果未能解决你的问题,请参考以下文章