Go语言通过encoding/json包实现JSON读写,先定义结构体并用json标签映射字段,使用ioutil.ReadFile读取文件后由json.Unmarshal解析到结构体;写入时用json.MarshalIndent序列化结构体,再通过ioutil.WriteFile保存为格式化JSON文件;对于动态结构可用map[string]interface{}接收数据并配合类型断言处理;最终可封装为LoadConfig和SaveConfig函数用于配置管理,需注意错误处理与标签正确性。

在Go语言开发中,处理JSON数据是常见需求,尤其是在配置文件读写、API数据交互等场景。Golang标准库中的encoding/json包提供了完整的JSON编码与解码支持,结合os和io相关操作,可以轻松实现JSON文件的读取与写入。
解析JSON文件:读取数据到结构体
要从JSON文件中读取数据,先定义一个与JSON结构匹配的结构体,然后使用json.Unmarshal将文件内容反序列化。
假设有一个config.json文件:
{
"name": "Alice",
"age": 30,
"active": true,
"tags": ["developer", "go", "backend"]
}
对应的Go结构体和读取代码如下:
立即学习“go语言免费学习笔记(深入)”;
package main
import (
"encoding/json"
"io/ioutil"
"log"
)
type Config struct {
Name string `json:"name"`
Age int `json:"age"`
Active bool `json:"active"`
Tags []string `json:"tags"`
}
func readJSON() {
data, err := ioutil.ReadFile("config.json")
if err != nil {
log.Fatalf("读取文件失败: %v", err)
}
var config Config
err = json.Unmarshal(data, &config)
if err != nil {
log.Fatalf("解析JSON失败: %v", err)
}
log.Printf("读取结果: %+v", config)
}
ioutil.ReadFile一次性读取整个文件内容,json.Unmarshal将其解析为结构体实例。注意结构体字段需导出(首字母大写),并使用json:标签对应JSON字段名。
生成JSON文件:将结构体写入文件
将Go结构体数据保存为JSON文件,使用json.Marshal或json.MarshalIndent序列化,再通过ioutil.WriteFile写入磁盘。
func writeJSON() {
config := Config{
Name: "Bob",
Age: 25,
Active: false,
Tags: []string{"tester", "qa"},
}
// 使用 MarshalIndent 生成格式化JSON
data, err := json.MarshalIndent(config, "", " ")
if err != nil {
log.Fatalf("序列化失败: %v", err)
}
err = ioutil.WriteFile("output.json", data, 0644)
if err != nil {
log.Fatalf("写入文件失败: %v", err)
}
log.Println("JSON文件写入成功")
}
json.MarshalIndent可生成带缩进的易读JSON,第二个参数为前缀(通常为空),第三个为缩进字符(如两个空格)。
处理未知结构或动态JSON
当JSON结构不确定时,可以用map[string]interface{}或interface{}接收数据。
func readDynamicJSON() {
data, err := ioutil.ReadFile("config.json")
if err != nil {
log.Fatal(err)
}
var raw map[string]interface{}
err = json.Unmarshal(data, &raw)
if err != nil {
log.Fatal(err)
}
for k, v := range raw {
log.Printf("%s: %v (%T)", k, v, v)
}
}
这种方式适合处理配置项不固定或第三方接口返回结构多变的情况。注意类型断言的使用,比如v.(float64)处理数字(JSON中数字默认解析为float64)。
完整示例:读写JSON配置文件
将读写操作整合,实现一个简单的配置管理功能:
func main() {
readJSON()
writeJSON()
}
确保项目根目录下存在config.json,运行程序后会生成output.json。实际项目中可封装成LoadConfig和SaveConfig函数,提升复用性。
基本上就这些。Golang的encoding/json设计简洁高效,配合文件IO能快速完成JSON持久化操作,适合大多数配置和数据交换场景。注意错误处理和结构体标签的正确使用,避免解析失败。










