go写json文件需用json.marshalindent生成可读格式,注意结构体字段导出与json标签、os.writefile权限及父目录创建,避免乱码和错误忽略。

Go 语言写入 JSON 文件本身很简单,但容易在编码、错误处理、文件权限和结构体标签上出错——尤其当你想让输出可读、带缩进,或字段名按预期出现时。
用 json.MarshalIndent 生成格式化 JSON 字符串
直接用 json.Marshal 会得到紧凑(无换行无缩进)的 JSON,不利于调试或人工查看。需要可读输出,必须用 json.MarshalIndent。
-
json.MarshalIndent(v, "", " "):第二个参数是前缀(通常空字符串),第三个是每级缩进(比如两个空格) - 如果结构体字段没加
json标签,导出时字段名会按 Go 命名规则(首字母大写)转为驼峰,但 JSON 键名可能不符合 API 要求 - 注意:
json.MarshalIndent返回[]byte,不是字符串;写文件前别误用string(b)拼接,它已经是你需要的完整 JSON 内容
写入文件时必须检查 os.WriteFile 或 io.Write 的错误
很多人只检查 json.MarshalIndent 的 error,却忽略写磁盘失败(如磁盘满、权限不足、路径不存在)。这两步错误都得单独处理。
- 推荐用
os.WriteFile(filename, data, 0644):简洁,自动创建文件、覆盖写入,权限位别写成0777(不安全),0644是常规选择 - 如果要追加写入(不覆盖),不能用
os.WriteFile,得用os.OpenFile配合os.O_APPEND | os.O_CREATE | os.O_WRONLY - 路径中父目录不存在?
os.WriteFile不会自动创建,需提前调用os.MkdirAll(filepath.Dir(filename), 0755)
结构体字段必须导出 + 正确设置 json 标签
JSON 编码器只能访问导出字段(首字母大写),且默认键名就是字段名。想控制键名、忽略空值、或跳过零值字段,全靠 json 标签。
- 导出字段示例:
Name string `json:"name"`→ 输出{"name":"xxx"} - 忽略空字符串/零值:
Count int `json:"count,omitempty"`→ 如果Count == 0,该字段不出现在 JSON 中 - 忽略字段:
Password string `json:"-"`→ 完全不编码 - 嵌套结构体字段也要逐层导出,否则中间一层为
null
中文乱码?确保写入的是 UTF-8 字节流,不要额外转义
Go 的 string 和 []byte 默认就是 UTF-8,json.MarshalIndent 输出也是 UTF-8。只要不手动用 strconv.Quote 或误加 html.EscapeString,就不会出现 \uXXXX 形式乱码。
- 常见错误:把
json.MarshalIndent结果再传给fmt.Sprintf("%q", b),导致双层转义 - 写入文件后用
cat file.json或 VS Code 查看,确认编辑器编码设为 UTF-8 - 如果 JSON 中仍有 \uXXXX,说明原始字符串里就含 Unicode 转义,不是编码问题,而是数据来源不对
最常被跳过的其实是父目录创建和字段标签 —— 一写就报 “no such file or directory” 或 JSON 键名全是大写,往往就卡在这两步。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











