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

举报
皮牙子抓饭 发表于 2023/11/11 19:21:14 2023/11/11
【摘要】 golang json 序列化、反序列化 字符串反序列化在使用Golang进行开发时,经常会遇到需要将一段JSON字符串进行序列化和反序列化的情况。JSON是一种轻量级数据交换格式,常用于前后端数据传输、存储等场景。Golang提供了内置的​​encoding/json​​包来处理JSON的序列化和反序列化。JSON的序列化JSON的序列化是指将数据结构或对象转换为JSON字符串的过程。在G...

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

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

JSON的序列化

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

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的格式。 输出结果为:

jsonCopy code{"name":"Alice","age":25}

JSON的反序列化

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

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​​函数。 输出结果为:

goCopy code{Name:Alice Age:25}

字符串反序列化

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

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来保存用户的注册信息,并在需要时将其序列化和反序列化。

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​​对象。 总之,序列化和反序列化是将对象或数据结构转换为字符串,并从字符串中还原出对象或数据结构的过程,常用于数据的持久化存储和网络通信。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。