跳到主要内容

Go JSON 处理

介绍

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于 Web 应用程序中。Go 语言提供了强大的标准库支持,使得 JSON 的编码和解码变得非常简单。本文将带你了解如何在 Go 中处理 JSON 数据,并通过实际案例展示其应用。

JSON 编码与解码

在 Go 中,encoding/json 包提供了对 JSON 数据的编码和解码支持。编码(Encoding)是将 Go 数据结构转换为 JSON 格式,而解码(Decoding)则是将 JSON 数据解析为 Go 数据结构。

编码:将 Go 结构体转换为 JSON

假设我们有一个 Go 结构体,表示一个用户:

go
type User struct {
ID int `json:"id"`
Username string `json:"username"`
Email string `json:"email"`
}

要将这个结构体转换为 JSON,可以使用 json.Marshal 函数:

go
user := User{ID: 1, Username: "john_doe", Email: "john@example.com"}
jsonData, err := json.Marshal(user)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(jsonData))

输出:

json
{"id":1,"username":"john_doe","email":"john@example.com"}

解码:将 JSON 转换为 Go 结构体

假设我们有一段 JSON 数据,表示一个用户:

json
{"id":1,"username":"john_doe","email":"john@example.com"}

要将这段 JSON 数据解析为 Go 结构体,可以使用 json.Unmarshal 函数:

go
jsonData := []byte(`{"id":1,"username":"john_doe","email":"john@example.com"}`)
var user User
err := json.Unmarshal(jsonData, &user)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", user)

输出:

go
{ID:1 Username:john_doe Email:john@example.com}

处理嵌套结构

在实际应用中,JSON 数据通常包含嵌套结构。Go 语言同样支持处理嵌套的 JSON 数据。

示例:嵌套结构

假设我们有一个包含嵌套结构的 JSON 数据:

json
{
"id": 1,
"username": "john_doe",
"email": "john@example.com",
"address": {
"city": "New York",
"zipcode": "10001"
}
}

我们可以定义一个嵌套的结构体来表示这个数据:

go
type Address struct {
City string `json:"city"`
Zipcode string `json:"zipcode"`
}

type User struct {
ID int `json:"id"`
Username string `json:"username"`
Email string `json:"email"`
Address Address `json:"address"`
}

然后使用 json.Unmarshal 函数将 JSON 数据解析为 Go 结构体:

go
jsonData := []byte(`{"id":1,"username":"john_doe","email":"john@example.com","address":{"city":"New York","zipcode":"10001"}}`)
var user User
err := json.Unmarshal(jsonData, &user)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", user)

输出:

go
{ID:1 Username:john_doe Email:john@example.com Address:{City:New York Zipcode:10001}}

实际应用场景

场景 1:从 API 获取 JSON 数据

假设我们需要从一个 API 获取用户数据,并将其解析为 Go 结构体。我们可以使用 net/http 包来发送 HTTP 请求,并使用 json.Unmarshal 来解析响应数据。

go
resp, err := http.Get("https://api.example.com/user/1")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()

var user User
err = json.NewDecoder(resp.Body).Decode(&user)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%+v\n", user)

场景 2:将数据保存为 JSON 文件

假设我们需要将用户数据保存为 JSON 文件。我们可以使用 json.Marshal 将结构体转换为 JSON 数据,并将其写入文件。

go
user := User{ID: 1, Username: "john_doe", Email: "john@example.com"}
jsonData, err := json.Marshal(user)
if err != nil {
log.Fatal(err)
}

err = os.WriteFile("user.json", jsonData, 0644)
if err != nil {
log.Fatal(err)
}

总结

在本文中,我们学习了如何在 Go 中处理 JSON 数据,包括编码、解码以及处理嵌套结构。我们还通过实际应用场景展示了如何从 API 获取 JSON 数据以及如何将数据保存为 JSON 文件。

提示

如果你对 Go 的 JSON 处理有更深入的兴趣,可以尝试处理更复杂的 JSON 结构,或者探索 json.MarshalIndent 函数来生成格式化的 JSON 数据。

附加资源

练习

  1. 编写一个 Go 程序,将一个包含多个用户的 JSON 数组解析为 Go 结构体切片。
  2. 修改上述程序,将解析后的用户数据保存为多个 JSON 文件,每个文件对应一个用户。