Golang处理JSON格式HTTP请求示例

11次阅读

go http服务解析jsON需先用io.ReadAll读取r.Body并defer关闭,检查Content-Type为application/json结构体字段须用json:”key”显式标记,空值处理用omitempty或指针;遇u0000错误应预清理控制字符。

Golang处理JSON格式HTTP请求示例

Go HTTP服务如何正确接收并解析JSON请求体

必须用 io.ReadAll 读取 r.Body,不能直接传给 json.Unmarshal —— 否则会因未关闭或重复读取导致后续中间件或日志丢失数据,甚至返回空对象

  • 先调用 r.Parseform() 对 JSON 请求无效,它只处理 application/x-www-form-urlencodedmultipart/form-data
  • 务必检查 Content-Type 是否为 application/json,否则可能把表单数据当 JSON 解析而报错 invalid character 't' looking for beginning of value
  • 读取后记得用 defer r.Body.Close(),否则连接不会复用,压测时很快耗尽 MaxIdleConns

使用结构体绑定JSON时字段名和tag怎么写才不丢数据

Go 的 json 包默认按导出字段(首字母大写)匹配 JSON 键,但大小写和下划线习惯常不一致。靠默认规则容易漏字段,必须显式用 json: tag 控制。

  • JSON 键是 user_id,结构体字段应写 UserID int `json:"user_id"`,不是 UserIdUSERID
  • 想忽略空字段(如前端没传),加 omitempty:`json:”name,omitempty”`
  • 字段设为指针(如 *String)才能区分“未传”和“传了空字符串”,否则 "" 和未传都变成零值

遇到 invalid character ‘u0000’ 错误怎么办

这个错误通常不是 JSON 格式问题,而是请求体里混入了空字节u0000)—— 常见于前端JSON.stringify 后手动拼接字符串、或某些调试工具注入不可见字符。

  • 在解析前先清理:用 bytes.Trim(rBytes, "x00") 去掉首尾空字节
  • 更稳妥的做法是用 strings.map 过滤所有控制字符:
    cleaned := strings.Map(func(r rune) rune {     if r < 32 && r != 't' && r != 'n' && r != 'r' {         return -1     }     return r }, string(rBytes))
  • 别跳过 json.Unmarshal 的错误检查,空字节错误会返回 json.SyntaxError,可针对性 log

要不要用第三方库比如 easyjson 或 ffjson

标准库 encoding/json 足够应对大多数场景;引入第三方 JSON 库只有在 QPS 超过 5k 且 profiling 明确显示 json.Unmarshal 是瓶颈时才值得。

立即学习go语言免费学习笔记(深入)”;

  • easyjson 需要额外代码生成步骤,升级 Go 版本后常需重跑 easyjson 命令,CI 流程变重
  • ffjson 已多年未维护,Go 1.21+ 中部分反射行为变更会导致 panic
  • 真正影响性能的往往不是解析本身,而是结构体字段太多、嵌套太深,或用了 Interface{} 导致运行时类型推断开销大

复杂点在于:HTTP 请求体是流式读取的,一旦读错位置(比如提前 close、或用 bufio.Scanner 混用),就无法重试 —— 所以第一道解析逻辑必须稳,宁可多 check 几次,也不要图省事跳过验证。

text=ZqhQzanResources