Go中保存结构体为JSON文件需用encoding/json.Marshal序列化并os.WriteFile写入,字段须大写导出,推荐用struct tag控制键名和omitempty等行为,支持MarshalIndent生成格式化JSON及直接序列化结构体切片。

在 Go 语言中,将结构体数据保存为 JSON 文件非常简单,核心是使用 encoding/json 包的 json.Marshal 序列化数据,再用 os.WriteFile(或 ioutil.WriteFile,已弃用)写入文件。
定义结构体并标记 JSON 字段名
Go 默认只导出首字母大写的字段,且 JSON 键名默认为字段名。推荐显式使用 struct tag 控制键名、忽略空值等:
例如:
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email,omitempty"` // 空字符串时不会出现在 JSON 中
IsActive bool `json:"is_active"`
}
序列化结构体并写入文件
使用 json.Marshal 转为字节切片,再用 os.WriteFile 保存到磁盘:
立即学习“go语言免费学习笔记(深入)”;
- 确保结构体字段可导出(首字母大写)
- 检查
json.Marshal是否返回错误(如含不可序列化字段:func、channel、map[interface{}]string 等) - 指定文件路径和权限(常用
0644)
示例代码:
user := User{ID: 1, Name: "Alice", Email: "", IsActive: true}
data, err := json.Marshal(user)
if err != nil {
log.Fatal("JSON 编码失败:", err)
}
err = os.WriteFile("user.json", data, 0644)
if err != nil {
log.Fatal("写入文件失败:", err)
}
写入格式化(缩进)JSON
若需人类可读的换行与缩进,用 json.MarshalIndent 替代 Marshal:
data, err := json.MarshalIndent(user, "", " ") // 2个空格缩进
if err != nil {
log.Fatal(err)
}
os.WriteFile("user_pretty.json", data, 0644)
批量保存结构体切片
支持直接序列化 []User 类型,无需额外循环:
users := []User{
{ID: 1, Name: "Alice", IsActive: true},
{ID: 2, Name: "Bob", IsActive: false},
}
data, _ := json.MarshalIndent(users, "", " ")
os.WriteFile("users.json", data, 0644)










