在Golang开发中,JSON文件是常见的数据交换和存储格式,很多配置信息、接口返回数据都会采用JSON格式。下面我们一步步学习如何在Golang中处理JSON文件。

读取JSON文件并解析为结构体
首先我们需要先读取JSON文件的内容,然后使用Golang内置的encoding/json包将JSON数据反序列化为对应的结构体。首先定义和JSON结构匹配的结构体,注意结构体字段的标签要对应JSON的键名。
package main
import (
"encoding/json"
"fmt"
"os"
)
// 定义和JSON结构匹配的结构体
type User struct {
Name string `json:"name"` // 对应JSON中的name字段
Age int `json:"age"` // 对应JSON中的age字段
Email string `json:"email"` // 对应JSON中的email字段
}
func main() {
// 读取JSON文件内容
data, err := os.ReadFile("user.json")
if err != nil {
fmt.Println("读取文件失败:", err)
return
}
// 定义接收解析结果的结构体变量
var user User
// 反序列化JSON数据
err = json.Unmarshal(data, &user)
if err != nil {
fmt.Println("解析JSON失败:", err)
return
}
fmt.Printf("解析结果: 姓名=%s, 年龄=%d, 邮箱=%s\n", user.Name, user.Age, user.Email)
}假设我们的user.json文件内容如下:
{
"name": "张三",
"age": 25,
"email": "test@ipipp.com"
}将结构体序列化为JSON并写入文件
如果我们需要把程序中的结构体数据保存为JSON文件,可以使用json.Marshal或者json.MarshalIndent方法序列化数据,然后写入文件。json.MarshalIndent会生成带缩进的格式化JSON,可读性更好。
package main
import (
"encoding/json"
"fmt"
"os"
)
type Product struct {
ID int `json:"id"`
Name string `json:"name"`
Price float64 `json:"price"`
}
func main() {
// 初始化结构体数据
product := Product{
ID: 1001,
Name: "无线鼠标",
Price: 89.9,
}
// 序列化为带缩进的JSON数据
data, err := json.MarshalIndent(product, "", " ")
if err != nil {
fmt.Println("序列化失败:", err)
return
}
// 写入JSON文件
err = os.WriteFile("product.json", data, 0644)
if err != nil {
fmt.Println("写入文件失败:", err)
return
}
fmt.Println("JSON文件写入成功")
}处理复杂JSON结构
如果遇到JSON结构比较复杂,比如包含嵌套对象、数组的情况,我们可以先定义嵌套的结构体,或者使用map[string]interface{}来接收解析结果。下面是一个包含数组的JSON解析示例:
package main
import (
"encoding/json"
"fmt"
"os"
)
type Class struct {
ClassName string `json:"class_name"`
Students []string `json:"students"` // 数组类型的字段
}
func main() {
data, err := os.ReadFile("class.json")
if err != nil {
fmt.Println("读取文件失败:", err)
return
}
var class Class
err = json.Unmarshal(data, &class)
if err != nil {
fmt.Println("解析失败:", err)
return
}
fmt.Printf("班级名称: %s\n", class.ClassName)
fmt.Println("学生列表:")
for _, student := range class.Students {
fmt.Println("- ", student)
}
}处理空值字段的技巧
如果JSON中存在可能为空的字段,我们可以在结构体标签中加上omitempty,这样当字段值为零值时,序列化时就会自动忽略该字段,不会写入JSON文件。
package main
import (
"encoding/json"
"fmt"
)
type Info struct {
Title string `json:"title"`
Desc string `json:"desc,omitempty"` // 零值时忽略该字段
CreateAt string `json:"create_at"`
}
func main() {
info := Info{
Title: "测试标题",
Desc: "", // 空字符串,属于零值
CreateAt: "2024-05-01",
}
data, _ := json.MarshalIndent(info, "", " ")
fmt.Println(string(data))
}运行上面的代码,输出的JSON中不会包含desc字段,符合我们的预期。
常见注意事项
- 结构体字段的首字母必须大写,否则
encoding/json包无法访问该字段,导致解析或序列化失败。 - JSON的键名和结构体标签中的名称要完全一致,区分大小写,否则无法正确映射。
- 读取文件时要处理可能出现的文件不存在、权限不足等错误,避免程序 panic。
GolangJSONencoding_json文件操作结构体映射修改时间:2026-06-02 16:10:02