Golang中form-data数组经json.Marshal后转为单字符串问题求助
解决Gin框架form-data数组绑定后JSON序列化异常问题
问题根源
你碰到的问题本质是form-data数组的传递方式不符合Gin绑定的预期规则:如果在Postman里把多个值用逗号拼在同一个recipient字段里,Gin的ShouldBind会把这整串内容当成单个字符串存入[]string数组,而非拆分出多个独立元素。虽然打印时视觉上像数组,但实际是单元素数组,所以json.Marshal后会输出包含拼接字符串的单元素数组。
具体解决步骤
1. 修正结构体绑定标签
确保结构体的Recipient字段添加form标签,明确对应form-data的字段名:
type MsgRequest struct { Recipient []string `form:"recipient"` // 标签名要和Postman的字段key一致 // 其他字段... }
2. 调整Postman的form-data传参方式
不要在单个recipient字段里用逗号分隔多个值,而是添加多个相同key的条目:
- 点击form-data区域的「Add」按钮新增行
- 第一行Key填
recipient,Value填0558485290 - 第二行Key同样填
recipient,Value填0209739442
如果习惯用recipient[]作为字段key,那就把结构体标签改成form:"recipient[]",同时Postman里的Key也设为recipient[],同样添加多个条目即可。
3. 验证绑定结果
绑定后先检查数组长度,确认是多个元素:
var req MsgRequest if err := c.ShouldBind(&req); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) return } fmt.Println(len(req.Recipient)) // 正常应该输出2 fmt.Println(req.Recipient) // 输出 [0558485290 0209739442]
此时再执行json.Marshal(req),得到的JSON中Recipient字段就会是["0558485290","0209739442"],符合预期。
补充说明
Gin的ShouldBind处理form-data时,只有当同一个key存在多个独立值时,才会自动解析为数组。如果仅传递一个key且值是逗号拼接的字符串,它会被当作单个元素存入数组,这就是你遇到序列化异常的核心原因。
内容的提问来源于stack exchange,提问作者user22097984
相关产品推荐
相关产品推荐

