Go-JSON、XML、CSV格式数据处理

1. JSON 数据处理

JSON 是一种轻量级的数据交换格式,Go 提供了 encoding/json 包来处理 JSON 数据的解析和编码。

1.1 JSON 解码

以下代码展示了如何将 JSON 字符串解码为 Go 结构体。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"encoding/json"
"fmt"
)

type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}

func main() {
jsonData := `{"name": "Alice", "age": 25}`
var person Person
err := json.Unmarshal([]byte(jsonData), &person)
if err != nil {
fmt.Println("JSON 解码失败:", err)
return
}
fmt.Printf("姓名:%s, 年龄:%d\\n", person.Name, person.Age)
}

1.2 JSON 编码

将 Go 结构体编码为 JSON 字符串同样简单。

1
2
3
4
5
6
7
person := Person{Name: "Bob", Age: 30}
jsonData, err := json.Marshal(person)
if err != nil {
fmt.Println("JSON 编码失败:", err)
return
}
fmt.Println("JSON 字符串:", string(jsonData))

2. XML 数据处理

XML 是一种常用于数据交换的标记语言。在 Go 中,可以使用 encoding/xml 包来解析和编码 XML 数据。

2.1 XML 解码

以下代码展示了如何将 XML 数据解码为 Go 结构体。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
"encoding/xml"
"fmt"
)

type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
}

func main() {
xmlData := `<person><name>Charlie</name><age>28</age></person>`
var person Person
err := xml.Unmarshal([]byte(xmlData), &person)
if err != nil {
fmt.Println("XML 解码失败:", err)
return
}
fmt.Printf("姓名:%s, 年龄:%d\\n", person.Name, person.Age)
}

2.2 XML 编码

我们还可以将 Go 结构体编码为 XML 数据。

1
2
3
4
5
6
7
person := Person{Name: "Diana", Age: 35}
xmlData, err := xml.Marshal(person)
if err != nil {
fmt.Println("XML 编码失败:", err)
return
}
fmt.Println("XML 数据:", string(xmlData))

3. CSV 数据处理

CSV 格式主要用于表格数据,Go 的 encoding/csv 包提供了读取和写入 CSV 文件的方法。

3.1 CSV 读取

以下代码展示了如何从 CSV 文件中读取数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
"encoding/csv"
"fmt"
"os"
)

func main() {
file, err := os.Open("data.csv")
if err != nil {
fmt.Println("打开 CSV 文件失败:", err)
return
}
defer file.Close()

reader := csv.NewReader(file)
records, err := reader.ReadAll()
if err != nil {
fmt.Println("读取 CSV 文件失败:", err)
return
}
fmt.Println("CSV 内容:", records)
}

3.2 CSV 写入

以下代码展示了如何将数据写入 CSV 文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
file, err := os.Create("output.csv")
if err != nil {
fmt.Println("创建 CSV 文件失败:", err)
return
}
defer file.Close()

writer := csv.NewWriter(file)
data := [][]string{
{"Name", "Age"},
{"Eve", "24"},
{"Frank", "29"},
}
writer.WriteAll(data)
if err := writer.Error(); err != nil {
fmt.Println("写入 CSV 文件失败:", err)
}

4. 实用技巧

  • 错误处理:在处理不同数据格式时,务必进行错误检查,以防止不符合预期的数据格式导致程序崩溃。
  • 数据验证:在解析 JSON 和 XML 数据时,尽量使用结构体字段标签,以确保数据格式符合预期。
  • 流式处理:对于大文件,可以考虑流式读取和写入,以节省内存。