Go 语言 JSON数据序列化与反序列化示例

Go阿木 发布于 27 天前 3 次阅读


Go 语言 JSON 数据序列化与反序列化示例详解

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Go 语言内置了对 JSON 数据的序列化和反序列化支持,使得在 Go 语言中进行数据交换和处理变得非常方便。本文将围绕 Go 语言 JSON 数据序列化与反序列化进行详细讲解,并通过示例代码展示其应用。

JSON 序列化

JSON 序列化是将 Go 语言中的数据结构转换为 JSON 格式的字符串的过程。Go 语言提供了 `encoding/json` 包来实现这一功能。

示例:序列化结构体

go

package main

import (


"encoding/json"


"fmt"


)

type Person struct {


Name string `json:"name"`


Age int `json:"age"`


Address string `json:"address,omitempty"`


}

func main() {


person := Person{


Name: "John Doe",


Age: 30,


Address: "123 Main St",


}

jsonData, err := json.Marshal(person)


if err != nil {


fmt.Println("Error marshalling:", err)


return


}

fmt.Println(string(jsonData))


}


在上面的示例中,我们定义了一个 `Person` 结构体,并使用 `json.Marshal` 函数将其序列化为 JSON 字符串。`json:"name"`、`json:"age"` 和 `json:"address,omitempty"` 是结构体字段的 JSON 标签,用于指定 JSON 字段名。`omitempty` 标签表示如果字段值为空,则不包含该字段。

示例:序列化切片

go

package main

import (


"encoding/json"


"fmt"


)

type Person struct {


Name string `json:"name"`


Age int `json:"age"`


}

func main() {


people := []Person{


{Name: "John Doe", Age: 30},


{Name: "Jane Smith", Age: 25},


}

jsonData, err := json.Marshal(people)


if err != nil {


fmt.Println("Error marshalling:", err)


return


}

fmt.Println(string(jsonData))


}


在这个示例中,我们序列化了一个 `Person` 类型的切片。`json.Marshal` 函数会自动处理切片的序列化。

JSON 反序列化

JSON 反序列化是将 JSON 字符串转换为 Go 语言数据结构的过程。同样,`encoding/json` 包提供了 `json.Unmarshal` 函数来实现这一功能。

示例:反序列化结构体

go

package main

import (


"encoding/json"


"fmt"


)

type Person struct {


Name string `json:"name"`


Age int `json:"age"`


Address string `json:"address,omitempty"`


}

func main() {


jsonData := `{"name":"John Doe","age":30,"address":"123 Main St"}`


var person Person

err := json.Unmarshal([]byte(jsonData), &person)


if err != nil {


fmt.Println("Error unmarshalling:", err)


return


}

fmt.Printf("Name: %s, Age: %d, Address: %s", person.Name, person.Age, person.Address)


}


在这个示例中,我们使用 `json.Unmarshal` 函数将 JSON 字符串反序列化为 `Person` 结构体。`[]byte(jsonData)` 将字符串转换为字节切片,这是 `json.Unmarshal` 函数所要求的。

示例:反序列化切片

go

package main

import (


"encoding/json"


"fmt"


)

type Person struct {


Name string `json:"name"`


Age int `json:"age"`


}

func main() {


jsonData := `[{"name":"John Doe","age":30},{"name":"Jane Smith","age":25}]`


var people []Person

err := json.Unmarshal([]byte(jsonData), &people)


if err != nil {


fmt.Println("Error unmarshalling:", err)


return


}

for _, person := range people {


fmt.Printf("Name: %s, Age: %d", person.Name, person.Age)


}


}


在这个示例中,我们反序列化了一个 JSON 字符串,该字符串表示一个 `Person` 类型的切片。

高级特性

自定义序列化与反序列化

在某些情况下,你可能需要自定义序列化或反序列化的行为。`encoding/json` 包提供了 `json.Marshaler` 和 `json.Unmarshaler` 接口来实现这一点。

编码与解码

`encoding/json` 包还支持对 JSON 数据进行编码和解码,以便在网络上传输。这可以通过 `json.Marshal` 和 `json.Unmarshal` 函数实现。

处理未知字段

当 JSON 数据包含未知字段时,可以使用 `json.RawMessage` 类型来处理这些字段。

总结

Go 语言的 `encoding/json` 包提供了强大的 JSON 序列化和反序列化功能,使得在 Go 语言中进行数据交换和处理变得非常方便。通过本文的示例,我们了解了如何使用 `json.Marshal` 和 `json.Unmarshal` 函数进行 JSON 数据的序列化和反序列化,以及如何处理一些高级特性。掌握这些技术将有助于你在 Go 语言项目中高效地处理 JSON 数据。