首页 > 其他分享 >golang json 序列化、反序列化 字符串反序列化

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

时间:2023-11-11 19:31:30浏览次数:34  
标签:err fmt JSON golang json 字符串 序列化

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

标签:err,fmt,JSON,golang,json,字符串,序列化
From: https://blog.51cto.com/u_15702012/8319222

相关文章

  • Delphi 用TDatasetToJSONBridge原生支持DataSet导出Json(转红鱼儿)
    Xalion发现data.DBJson单元,不知什么时候加的,官方帮助中也没有写。1procedureTForm18.Button2Click(Sender:TObject);2var3cV:TDatasetToJSONBridge;4jo:Tjsonobject;5begin6cV:=TDatasetToJSONBridge.Create;7try8cV.Dataset:=mt;......
  • PHP反序列化题型_绕过preg_match1
    ctfshowweb266<?phphighlight_file(__FILE__);include('flag.php');$cs=file_get_contents('php://input');classctfshow{public$username='xxxxxx';public$password='xxxxxx';publicfunction__......
  • PHP反序列化题型_地址传参
    CTFSHOWweb265<?phperror_reporting(0);include('flag.php');highlight_file(__FILE__);classctfshowAdmin{public$token;public$password;publicfunction__construct($t,$p){$this->token=$t;$this->pass......
  • 基于Golang协程实现流量统计系统项目开发
    基于Golang协程实现流量统计系统项目开发上一节课我们已经架设好了一个网站。,但是因为我们的网站没有流量。也生成不了大量的日志,靠我们自己点击生成那点日志也不够测试的。所以这次我们就用GO语言批量生成我们想要的日志。好了。我们开始写代码我用的IDE工具是GOLAND,没有为......
  • 23.11.10(Ajax和Json的数据传输问题)
    使用Ajax写查询功能,后端数据一直传不到前端,遇到parse解析的卡住原因:传来的json数据格式不正确,后端Java还respond了一个success解决方法:把success去掉<scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script><script>$(d......
  • Golang使用nats
    nats自行安装packagemainimport( "fmt" "github.com/nats-io/nats.go")////nats-server在管理subject的时候是通过’.’进行分割的,server底层是使用treemodule分层管理subject.此处有两个通配符*和>。////*可以匹配以.分割的一切。如:////nc.Subscribe("aa.*......
  • Golang struct 结构体注意事项和使用细节
    结构体所有字段在内存当中是连续的typePointstruct{ x,yint}typeRectstruct{ leftUp,rightDownPoint}funcmain(){ //r1会在内存当中有四个整数 r1:=Rect{ leftUp:Point{ x:1, y:2, }, rightDown:Point{ x:3, y:4, }, } //r1有......
  • 【RuoYi移动端】HBuild工具插件安装和系统配置manifest.json
    一、点【工具】-【插件安装】安装如下工具  二、点【manifest.json】......
  • Golang锁简单使用
    golang主要有两种锁:互斥锁和读写锁互斥锁Mutex用于提供一种加锁机制(LockingMechanism),保证同一时刻只有一个goroutine在临界区运行packagemainimport( "fmt" "sync" "time")funcmain(){ varmutexsync.Mutex x:=0 gofunc(){ mutex.Lock() x=x+1......
  • Golang服务端断线重连
    断线重连的逻辑很简单,就是把用户存到服务器内存中,当客户端再次登录的时候,判断内存中是否有用户的值,有的话替换packagemainimport( "fmt" "github.com/gorilla/websocket" "log" "net/http" "sync" "time")typeClientstruct{ conn*we......