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 \<br> -H "Content-Type: application/json" \<br> -d '{"name":"Alice","age":30}'
定义结构体并绑定 JSON 字段
用结构体字段标签 json:"field_name" 明确映射关系,注意大小写与导出性:
- 结构体字段必须首字母大写(可导出),否则
json包无法访问 -
json:"name"表示 JSON 中的"name"键映射到该字段 - 可用
json:",omitempty"忽略零值字段(如空字符串、0、nil 切片) - 示例:
type User struct {<br> Name string `json:"name"`<br> Age int `json:"age"`<br> Email string `json:"email,omitempty"`<br> }
在 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) {<br> if r.Method != http.MethodPost {<br> http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)<br> return<br> }<br> <br> var u User<br> err := json.NewDecoder(r.Body).Decode(&u)<br> if err != nil {<br> http.Error(w, "Invalid JSON: "+err.Error(), http.StatusBadRequest)<br> return<br> }<br> // 此时 u 已填充,可继续业务逻辑<br> json.NewEncoder(w).Encode(map[string]string{"status": "ok"})<br> }
补充建议:验证与健壮性
生产环境建议增强容错能力:
- 对关键字段做非空/范围校验(如
Age > 0),失败时返回明确错误 - 限制请求体大小,防止恶意大 Payload(可用
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)限 1MB) - 若需同时支持表单和 JSON,应根据
r.Header.Get("Content-Type")分支处理 - 考虑用第三方库如
go-playground/validator做结构体字段级校验









