贝利信息

Golang Web接口返回JSON乱码怎么办_JSON编码问题说明

日期:2026-01-14 00:00 / 作者:P粉602998670
根本原因是响应头缺失Content-Type的charset声明,Go默认输出UTF-8字节但客户端未获知编码;需显式设置Header("Content-Type", "application/json; charset=utf-8"),并确保源文件、中间件、代理均不破坏该声明。

Go HTTP 返回 JSON 时中文显示为 或乱码

根本原因不是 Go 本身编码错误,而是响应头缺失 Content-Type 的字符集声明。Go 的 json.Marshal 默认输出 UTF-8 字节,但浏览器或客户端若没收到 Content-Type: application/json; charset=utf-8,可能按 ISO-8859-1 或系统默认编码解析,导致中文变问号或乱码。

使用 json.MarshalIndent 导致响应体开头多出空格或换行

开发调试时常用 json.MarshalIndent 格式化输出,但它会在 JSON 前插入缩进和换行(比如 \n {),而 HTTP 响应体开头若出现空白字符,部分严格解析的客户端(如某些嵌入式 HTTP 库、Postman 的某些模式)会直接报解析失败或丢弃首字符,表现为乱码或无效 JSON。

data := map[string]interface{}{"msg": "你好"}
b, _ := json.Marshal(data)
var out bytes.Buffer
json.Indent(&out, b, "", "  ")
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Write(out.Bytes())

Gin 框架中 c.JSON() 仍乱码的排查点

c.JSON(200, data) 内部已设置 Content-Type: application/json; charset=utf-8,但仍有乱码,大概率是中间件或自定义逻辑干扰了响应头。

前端 fetch 或 axios 接收 JSON 后仍显示乱码

服务端已正确返回 UTF-8 JSON 和响应头,但 JS 中 response.json() 解析后中文仍是乱码,问题通常出在传输层或前端解析时机。

最易忽略的是:本地测试时用 go run main.go 启动,但文件本身保存为 GBK 编码(尤其 Windows 记事本),导致源码里中文字符串字面量就是 GBK 字节,json.Marshal 只是原样编码输出,结果服务端发的是 GBK 字节流却声明了 UTF-8 charset —— 浏览器照着 UTF-8 解,必然乱码。务必统一用 UTF-8 编码保存 Go 源文件。