如何在Golang中写入JSON文件_保存结构体数据到文件

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 保存到磁盘:

  • 确保结构体字段可导出(首字母大写)
  • 检查 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)