Go语言中的文件与IO:JSON、CSV、XML处理

简介: 本文介绍了 Go 语言中对 JSON、CSV 和 XML 三种常见数据格式的处理方法。通过标准库 `encoding/json`、`encoding/csv` 和 `encoding/xml`,可以实现结构体与数据格式之间的序列化与反序列化。JSON 适合 Web API 和前后端通信,因其清晰易读;CSV 适用于表格数据和轻量级交换;XML 则支持复杂嵌套结构,常用于配置文件和 SOAP 协议。文中提供代码示例,涵盖基本使用、嵌套结构处理及实战建议,帮助开发者高效操作这些格式。

 

在数据交换与存储中,JSON、CSV、XML 是常见格式。Go 标准库为这些格式提供了强大且易用的支持,涵盖结构体映射、读写文件、编码解码等操作。


一、JSON处理(encoding/json

1. 基本使用:结构体 <-> JSON

type User struct {
    Name  string `json:"name"`
    Age   int    `json:"age"`
    Email string `json:"email,omitempty"` // 可选字段
}
user := User{Name: "Alice", Age: 30}
data, _ := json.Marshal(user)
fmt.Println(string(data)) // {"name":"Alice","age":30}

2. 反序列化 JSON -> 结构体

jsonStr := `{"name":"Bob","age":25}`
var u User
err := json.Unmarshal([]byte(jsonStr), &u)
fmt.Printf("%+v\n", u)

3. 处理嵌套结构、数组、map

type Post struct {
    ID     int
    Author User
    Tags   []string
}
post := Post{ID: 1, Author: user, Tags: []string{"go", "json"}}
jsonBytes, _ := json.MarshalIndent(post, "", "  ")
fmt.Println(string(jsonBytes))

二、CSV处理(encoding/csv

CSV 通常用于表格数据、Excel 导出等,Go 提供简单读写接口。

1. 写入 CSV 文件

file, _ := os.Create("data.csv")
defer file.Close()
writer := csv.NewWriter(file)
writer.Write([]string{"Name", "Age", "Email"})
writer.Write([]string{"Tom", "22", "tom@example.com"})
writer.Flush()

2. 读取 CSV 文件

file, _ := os.Open("data.csv")
defer file.Close()
reader := csv.NewReader(file)
records, _ := reader.ReadAll()
for _, record := range records {
    fmt.Println(record)
}

3. 自定义分隔符(如 ;

reader := csv.NewReader(file)
reader.Comma = ';'

CSV 不支持结构体直接映射,需手动转换。


三、XML处理(encoding/xml

1. 基本结构体标签

type Note struct {
    To      string `xml:"to"`
    From    string `xml:"from"`
    Message string `xml:"message"`
}

2. 序列化:结构体 -> XML

note := Note{"Tom", "Jerry", "Hello, XML!"}
data, _ := xml.MarshalIndent(note, "", "  ")
fmt.Println(xml.Header + string(data))

输出:

<?xml version="1.0" encoding="UTF-8"?>
<Note>
  <to>Tom</to>
  <from>Jerry</from>
  <message>Hello, XML!</message>
</Note>

3. 反序列化:XML -> 结构体

input := `<Note><to>Tom</to><from>Jerry</from><message>Hi</message></Note>`
var n Note
xml.Unmarshal([]byte(input), &n)
fmt.Printf("%+v\n", n)

4. 属性与嵌套结构

type Book struct {
    Title  string `xml:"title,attr"`
    Author string `xml:"author"`
}
type Library struct {
    XMLName xml.Name `xml:"library"`
    Books   []Book   `xml:"book"`
}

四、三者对比与适用场景

格式 特点 场景
JSON 结构清晰、易于网络传输 Web API、前后端通信
CSV 体积小、表格友好 报表导入导出、数据分析
XML 可扩展、支持属性与命名空间 配置文件、SOAP、嵌套数据

五、实战建议

  • • 使用 json.MarshalIndent 便于调试输出。
  • • 自定义字段名与 omitempty 控制输出字段。
  • csv 通常用于轻量级数据交换,不建议嵌套。
  • • 解析 XML 时注意标签与命名空间。

 

相关文章
|
13天前
|
SQL 关系型数据库 MySQL
Go语言数据库编程:使用 `database/sql` 与 MySQL/PostgreSQL
Go语言通过`database/sql`标准库提供统一数据库操作接口,支持MySQL、PostgreSQL等多种数据库。本文介绍了驱动安装、连接数据库、基本增删改查操作、预处理语句、事务处理及错误管理等内容,涵盖实际开发中常用的技巧与注意事项,适合快速掌握Go语言数据库编程基础。
102 62
|
18天前
|
JSON 中间件 Go
Go 网络编程:HTTP服务与客户端开发
Go 语言的 `net/http` 包功能强大,可快速构建高并发 HTTP 服务。本文从创建简单 HTTP 服务入手,逐步讲解请求与响应对象、URL 参数处理、自定义路由、JSON 接口、静态文件服务、中间件编写及 HTTPS 配置等内容。通过示例代码展示如何使用 `http.HandleFunc`、`http.ServeMux`、`http.Client` 等工具实现常见功能,帮助开发者掌握构建高效 Web 应用的核心技能。
150 61
|
22小时前
|
自然语言处理 Unix Linux
解决服务器中Jupyter笔记本的文件名字符编码问题
通过上述步骤,可以有效解决Jupyter笔记本的文件名字符编码问题,确保所有文件能在服务器上正常访问并交互,避免因编码问题引起的混淆和数据丢失。在处理任何编码问题时,务必谨慎并确保备份,因为文件名变更是
32 17
|
11天前
|
XML JSON Java
Java 反射:从原理到实战的全面解析与应用指南
本文深度解析Java反射机制,从原理到实战应用全覆盖。首先讲解反射的概念与核心原理,包括类加载过程和`Class`对象的作用;接着详细分析反射的核心API用法,如`Class`、`Constructor`、`Method`和`Field`的操作方法;最后通过动态代理和注解驱动配置解析等实战场景,帮助读者掌握反射技术的实际应用。内容翔实,适合希望深入理解Java反射机制的开发者。
48 13
|
8天前
|
人工智能 编解码 监控
常用驱动修复工具推荐,驱动精灵、驱动人生、显卡驱动、360驱动大师、驱动扫描修复驱动修复,声卡驱动修复,u盘驱动修复等修复工具
电脑驱动安装对解决卡顿、网速慢等问题至关重要。本文介绍了驱动精灵、驱动人生、NVIDIA专业显卡驱动、360驱动大师及联想乐驱动等常用驱动管理软件的功能与优势,涵盖硬件检测、智能升级、驱动备份与还原等特色功能,帮助用户优化电脑性能并提升系统稳定性。
158 14
|
12天前
|
SQL 缓存 监控
SQL 质量革命:利用 DAS 智能索引推荐修复慢查询全流程
在数据驱动时代,数据库性能直接影响系统稳定与响应速度。慢查询常因索引缺失、复杂逻辑或数据量过大引发,导致延迟、用户体验下降甚至业务受损。DAS(数据库管理服务)提供智能索引推荐功能,通过分析SQL语句与数据分布,自动生成高效索引方案,显著提升查询性能。本文结合实战案例,详解DAS智能索引推荐原理与使用流程,帮助用户快速定位问题并优化数据库表现,实现系统高效运行。
114 61
|
15天前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
62 18
|
15天前
|
应用服务中间件 网络安全 数据安全/隐私保护
网关服务器配置指南:实现自动DHCP地址分配、HTTP服务和SSH无密码登录。
哇哈哈,道具都准备好了,咱们的魔术秀就要开始了。现在,你的网关服务器已经魔法满满,自动分配IP,提供网页服务,SSH登录如入无人之境。而整个世界,只会知道效果,不会知道是你在幕后操控一切。这就是真正的数字世界魔法师,随手拈来,手到擒来。
62 14
|
18天前
|
JavaScript 前端开发 API
Node.js中发起HTTP请求的五种方式
以上五种方式,尽管只是冰山一角,但已经足以让编写Node.js HTTP请求的你,在连接世界的舞台上演奏出华丽的乐章。从原生的 `http`到现代的 `fetch`,每种方式都有独特的风格和表现力,让你的代码随着项目的节奏自由地舞动。
149 65
|
18天前
|
Linux Shell 定位技术
解决CentOS启动时挂载/sysroot失败
总的来说,解决/sysroot挂载失败的问题就像解开一串连环谜题,需要耐心和技巧。通过以上步骤,大多数时候我们可以找到问题的答案,打开系统启动的大门,让它顺利运行起来。
145 66