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 数据:
Content-Type: application/json 必须存在,否则服务端无法可靠识别curl -X POST http://localhost:8080/api/user \\
-H "Content-Type: application/json" \\
-d '{"name":"Alice","age":30}'
用结构体字段标签 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"`
}推荐使用 json.NewDecoder(r.Body).Decode(&v),它支持流式读取、内存友好且自动处理 EOF:
ioutil.ReadAll(Go 1.16+ 已弃用)或 io.ReadAll 读全部再解码,除非你需要多次读取或校验原始字节
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.Sta
tusBadRequest)
return
}
// 此时 u 已填充,可继续业务逻辑
json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
}生产环境建议增强容错能力:
Age > 0),失败时返回明确错误r.Body = http.MaxBytesReader(w, r.Body, 1 限 1MB)
r.Header.Get("Content-Type") 分支处理go-playground/validator 做结构体字段级校验