Go中解析JSON请求需设Content-Type头、用json.NewDecoder(r.Body).Decode(&u)反序列化,结构体字段须大写并用json标签映射,注意错误处理、大小限制与字段校验。

在 Go 中接收并解析 JSON 请求,核心是读取 HTTP 请求体、反序列化为 Go 结构体。关键点在于:正确设置请求头(Content-Type: application/json),使用 json.Decode(r.Body) 或 json.Unmarshal,并做好错误处理和请求体读取控制。
确保客户端发送标准 JSON 请求
客户端需设置请求头,并发送合法 JSON 数据:
-
Content-Type: application/json必须存在,否则服务端无法可靠识别 - JSON 内容需格式正确(如双引号包裹键名、无尾逗号)
- 例如 curl 示例:
curl -X POST http://localhost:8080/api/user \\
-H "Content-Type: application/json" \\
-d '{"name":"Alice","age":30}'
定义结构体并绑定 JSON 字段
用结构体字段标签 json:"field_name" 明确映射关系,注意大小写与导出性:
- 结构体字段必须首字母大写(可导出),否则
json包无法访问 -
json:"name"表示 JSON 中的"name"键映射到该字段 - 可用
json:",omitempty"忽略零值字段(如空字符串、0、nil 切片) - 示例:
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Email string `json:"email,omitempty"`
}
在 HTTP 处理函数中解析请求体
推荐使用 json.NewDecoder(r.Body).Decode(&v),它支持流式读取、内存友好且自动处理 EOF:
立即学习“go语言免费学习笔记(深入)”;
- 不要先用
ioutil.ReadAll(Go 1.16+ 已弃用)或io.ReadAll读全部再解码,除非你需要多次读取或校验原始字节 - 务必检查解码错误,常见错误包括:字段类型不匹配、JSON 格式错误、缺少必需字段(未设默认值)
- 示例代码:
func handleUser(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
return
}
var u User
err := json.NewDecoder(r.Body).Decode(&u)
if err != nil {
http.Error(w, "Invalid JSON: "+err.Error(), http.StatusBadRequest)
return
}
// 此时 u 已填充,可继续业务逻辑
json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
}
补充建议:验证与健壮性
生产环境建议增强容错能力:
- 对关键字段做非空/范围校验(如
Age > 0),失败时返回明确错误 - 限制请求体大小,防止恶意大 Payload(可用
r.Body = http.MaxBytesReader(w, r.Body, 1 限 1MB) - 若需同时支持表单和 JSON,应根据
r.Header.Get("Content-Type")分支处理 - 考虑用第三方库如
go-playground/validator做结构体字段级校验









