golang json 序列化、反序列化 字符串反序列化

golang json 序列化、反序列化 字符串反序列化

在使用Golang进行开发时,经常会遇到需要将一段JSON字符串进行序列化和反序列化的情况。JSON是一种轻量级数据交换格式,常用于前后端数据传输、存储等场景。Golang提供了内置的​​encoding/json​​包来处理JSON的序列化和反序列化。

JSON的序列化

JSON的序列化是指将数据结构或对象转换为JSON字符串的过程。在Golang中,可以使用​​json.Marshal()​​函数将数据序列化为JSON字符串。

go 复制代码
goCopy codepackage main
import (
    "encoding/json"
    "fmt"
)
type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}
func main() {
    p := Person{
        Name: "Alice",
        Age:  25,
    }
    // 将结构体序列化为JSON字符串
    jsonStr, err := json.Marshal(p)
    if err != nil {
        fmt.Println("序列化失败:", err)
        return
    }
    fmt.Println(string(jsonStr))
}

在上面的示例中,我们定义了一个名为​​Person​​的结构体,包含​​Name​​和​​Age​​两个字段。通过调用​​json.Marshal()​​函数将该结构体实例​​p​​序列化为JSON字符串。在结构体字段的标签中可以定义序列化和反序列化时的名称,以便更好地控制JSON的格式。 输出结果为:

css 复制代码
jsonCopy code{"name":"Alice","age":25}

JSON的反序列化

JSON的反序列化是指将JSON字符串转换为数据结构或对象的过程。在Golang中,可以使用​​json.Unmarshal()​​函数将JSON字符串反序列化为相应的数据结构。

go 复制代码
goCopy codepackage main
import (
    "encoding/json"
    "fmt"
)
type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}
func main() {
    jsonStr := `{"name":"Alice","age":25}`
    // 将JSON字符串反序列化为结构体
    var p Person
    err := json.Unmarshal([]byte(jsonStr), &p)
    if err != nil {
        fmt.Println("反序列化失败:", err)
        return
    }
    fmt.Println(p)
}

在上面的示例中,我们定义了一个名为​​Person​​的结构体。通过调用​​json.Unmarshal()​​函数将JSON字符串​​jsonStr​​反序列化为结构体变量​​p​​。需要注意的是,为了将JSON字符串正确解析为结构体,我们需要将JSON字符串转换为字节数组([]byte),并将结构体变量的指针传给​​Unmarshal​​函数。 输出结果为:

css 复制代码
goCopy code{Name:Alice Age:25}

字符串反序列化

有时候,我们可能会遇到需要将JSON字符串中的部分数据提取出来的情况。在Golang的​​encoding/json​​包中,提供了​​json.RawMessage​​类型来帮助我们进行字符串的反序列化。

go 复制代码
goCopy codepackage main
import (
    "encoding/json"
    "fmt"
)
type Person struct {
    Name string          `json:"name"`
    Data json.RawMessage `json:"data"`
}
type Data struct {
    Age int `json:"age"`
}
func main() {
    jsonStr := `{"name":"Alice","data":{"age":25}}`
    var p Person
    err := json.Unmarshal([]byte(jsonStr), &p)
    if err != nil {
        fmt.Println("反序列化失败:", err)
        return
    }
    var d Data
    err = json.Unmarshal(p.Data, &d)
    if err != nil {
        fmt.Println("反序列化失败:", err)
        return
    }
    fmt.Println(d.Age)
}

在上面的示例中,我们定义了一个名为​​Person​​的结构体,其中的​​Data​​字段使用了​​json.RawMessage​​类型。​​json.RawMessage​​类型可以用于延迟解析JSON数据,只需在需要使用时才进行反序列化。 输出结果为:

复制代码
goCopy code25

以上就是对Golang中JSON序列化、反序列化以及字符串反序列化的详细介绍。通过使用​​encoding/json​​包提供的函数和类型,我们能够方便地处理JSON数据,实现数据在不同格式之间的转换。希望本文对你有所帮助!

示例:用户注册信息的序列化和反序列化

假设我们正在编写一个用户注册系统,需要将用户的注册信息存储到数据库中。用户的注册信息包括用户名、密码和年龄。我们可以使用JSON来保存用户的注册信息,并在需要时将其序列化和反序列化。

go 复制代码
goCopy codepackage main
import (
    "encoding/json"
    "fmt"
)
type User struct {
    Username string `json:"username"`
    Password string `json:"password"`
    Age      int    `json:"age"`
}
func main() {
    // 用户注册
    user := User{
        Username: "Alice",
        Password: "123456",
        Age:      25,
    }
    // 将用户注册信息序列化为JSON字符串
    jsonData, err := json.Marshal(user)
    if err != nil {
        fmt.Println("序列化失败:", err)
        return
    }
    fmt.Println("序列化后的JSON字符串:", string(jsonData))
    // 模拟从数据库中读取的JSON字符串
    dbData := `{"username":"Bob","password":"654321","age":30}`
    // 将数据库中的JSON字符串反序列化为用户注册信息
    var dbUser User
    err = json.Unmarshal([]byte(dbData), &dbUser)
    if err != nil {
        fmt.Println("反序列化失败:", err)
        return
    }
    fmt.Println("反序列化后的用户信息:", dbUser)
}

上面的示例代码演示了用户注册信息的序列化和反序列化过程。通过​​json.Marshal()​​函数将用户注册信息序列化为JSON字符串,然后使用​​json.Unmarshal()​​函数将数据库中的JSON字符串反序列化为用户注册信息。这样我们就可以方便地将用户的注册信息存储到数据库中,并在需要时读取出来。

序列化****是将数据结构或对象转换为一种特定格式的字符串,以便将其存储在文件中、通过网络传输等。在序列化过程中,数据被编码为一个字符串,其中包含了对象的属性和值。常见的序列化格式有JSON、XML和Protocol Buffers等。序列化过程的主要目的是将数据格式化为一种通用的标准形式,以便存储和传输。 在示例代码中,我们使用了**​json.Marshal()​**函数将注册用户的信息序列化为JSON字符串。​​**​json.Marshal()​**​​函数将一个结构体对象转换为JSON格式的字符串,并返回序列化后的结果。 反序列化是将序列化后的字符串重新转换为原始的数据结构或对象。反序列化的过程是将字符串解码为对应的数据结构,恢复出原始的数据形式。通过反序列化,我们可以将存储文件、传输的数据等还原为原始的数据对象。 在示例代码中,我们使用了​**​json.Unmarshal()​**​​函数将数据库中的JSON字符串解码为​**​User​**​对象。​**​json.Unmarshal()​**​函数将接收一个JSON字符串和一个目标对象的指针作为参数,将JSON字符串解码后的值填充到目标对象中。 字符串反序列化是指将序列化后的字符串重新转换为原始的数据类型。字符串反序列化是序列化的逆过程,最常见的应用场景是从文件中读取序列化后的数据,并将其重新恢复为原始的数据格式。在示例代码中,我们模拟了从数据库中读取的JSON字符串,然后使用​**​json.Unmarshal()​**​函数进行反序列化,将数据库中的JSON字符串转换为​**​User​**​对象。 总之,序列化和反序列化是将对象或数据结构转换为字符串,并从字符串中还原出对象或数据结构的过程,常用于数据的持久化存储和网络通信。

相关推荐
南囝coding15 分钟前
Claude 封禁中国?为啥我觉得是个好消息
前端·后端
六边形工程师22 分钟前
Docker安装神通数据库ShenTong
后端
六边形工程师25 分钟前
快速入门神通数据库
后端
重生成为编程大王30 分钟前
FreeMarker快速入门指南
java·后端
Dear.爬虫36 分钟前
Golang的协程调度器原理
开发语言·后端·golang
元闰子41 分钟前
怎么用CXL加速数据库?· SIGMOD'25
数据库·后端·面试
幂简集成1 小时前
GraphQL API 性能优化实战:在线编程作业平台指南
后端·性能优化·graphql
编码浪子1 小时前
趣味学RUST基础篇(构建命令行程序1)
开发语言·后端·rust
周小码1 小时前
极快文本嵌入推理:Rust构建高性能嵌入推理解决方案
开发语言·后端·rust
蜗牛快跑1231 小时前
拆巨资让 Claude Code 和 Codex 同时住进了我的终端里
前端·后端·ai编程