
本文讲解如何将 JSON 中的字符串数组(如 "to": ["a@example.com", "b@example.com"])准确映射到 Go 结构体字段,解决因类型不匹配导致的解析失败问题。
本文讲解如何将 json 中的字符串数组(如 `"to": ["a@example.com", "b@example.com"]`)准确映射到 go 结构体字段,解决因类型不匹配导致的解析失败问题。
在 Go 的 JSON 解析中,若后端接收的 JSON 字段是无键的字符串数组(例如 "to" 和 "cc" 字段),则对应结构体字段必须声明为 []string 类型,而非 map[string]string 或 string —— 否则 json.Unmarshal 将静默失败或返回零值,且不报错。
以您提供的 JSON 为例:
{
"to": ["[email protected]", "[email protected]"],
"cc": ["[email protected]", "[email protected]"]
}其本质是 JSON array(方括号包裹的有序字符串列表),而非 JSON object(花括号包裹的键值对)。因此,结构体定义应严格匹配:
type emailData struct {
Body struct {
Template string `json:"template"`
Params map[string]string `json:"params"`
} `json:"body"`
To []string `json:"to"` // ✅ 正确:切片接收 JSON 数组
CC []string `json:"cc"` // ✅ 正确:同上
ReplyTo struct {
Email string `json:"email"`
Name string `json:"name"`
} `json:"replyTo"` // 注意:JSON key 是 "replyTo",需显式标注 tag
BCC string `json:"bcc"`
Subject string `json:"subject"`
}⚠️ 关键注意事项:
- 字段名大小写与 JSON key 匹配:Go 结构体字段需首字母大写(导出),并通过
json:"xxx"标签精确指定 JSON 键名(如"replyTo"不是"ReplyTo"); -
[]string可自动适配任意长度的字符串数组,无需预知元素个数; - 若误用
map[string]string(期待键值对)或string(期待单值),Unmarshal会跳过该字段或填充零值(如空切片[]或空字符串""),且不抛出错误,极易引发隐蔽 bug; - 建议始终检查
json.Unmarshal的返回错误,例如:var data emailData if err := json.Unmarshal(bodyBytes, &data); err != nil { log.Printf("JSON parse error: %v", err) http.Error(w, "Invalid request body", http.StatusBadRequest) return }
综上,只需将 To 和 CC 字段改为 []string 并确保 JSON tag 名称准确,即可健壮、高效地完成解析。这是 Go 处理 JSON 数组的标准实践,简洁且符合语言惯用法。


















