0

0

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

P粉602998670

P粉602998670

发布时间:2026-01-14 14:41:35

|

671人浏览过

|

来源于php中文网

原创

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

golang web接口返回json乱码怎么办_json编码问题说明

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

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

  • 务必在写响应前显式设置响应头:w.Header().Set("Content-Type", "application/json; charset=utf-8")
  • 不要依赖框架自动添加 charset(如 net/http 原生不加,Gin 默认加但某些中间件可能覆盖)
  • curl -v 或浏览器开发者工具 Network 面板确认响应头中 Content-Type 是否含 charset=utf-8

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

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

  • 生产环境禁用 json.MarshalIndent,只在日志或调试接口中使用
  • 若必须格式化响应,确保不破坏响应流:先 json.Marshal 得到字节切片,再用 json.Indent 处理,最后整体写入 w.Write
  • 注意 http.ResponseWriter 一旦调用 WriteHeader 或首次 Write,响应头即锁定,不能再改 Content-Type
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,但仍有乱码,大概率是中间件或自定义逻辑干扰了响应头。

  • 检查是否在 c.JSON() 前调用了 c.Header("Content-Type", ...)c.Data() 等底层写入方法
  • 确认没有全局注册的响应拦截中间件(如日志中间件)误写了响应头
  • 若用了 c.Render() 自定义模板,需手动设置 charset;c.JSON() 不走该流程
  • Gin v1.9+ 对非 ASCII 字符更严格,若结构体字段 tag 含 json:"name,string" 且值为非 UTF-8 字节,也会触发编码异常

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

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

来福FM
来福FM

来福 - 你的私人AI电台

下载

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

  • 确认响应状态码是 200,且未被代理(如 Nginx)截断或转码:Nginx 默认不修改响应体,但若配置了 charset utf-8; 在 location 块中,可能强制重写响应头,反而冲突
  • 避免在 fetch 中手动调用 response.text()JSON.parse() —— 这绕过了浏览器内置的 charset 检测逻辑,应直接用 response.json()
  • Chrome 开发者工具中查看 Response Headers,确认 Content-Type 未被覆盖;Response Preview 若显示乱码但 Raw 显示正常,说明是前端渲染问题而非传输问题

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

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

178

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

226

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

195

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

190

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

192

2025.06.17

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

36

2026.01.14

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号