You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:52:29