Golang-Json序列化和反序列化
json 的序列化介绍
json 序列化是指,将有 key-value 结构的数据类型(比如结构体、map、切片)序列化成 json 字符串的操作。
应用案例
这里我们介绍一下结构体、map 和切片的序列化,其它数据类型的序列化类似。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | package main import ( "fmt" "encoding/json" ) //定义一个结构体 type Monster struct { Name string Age int Birthday string Sal float64 Skill string } func testStruct() { //演示 monster := Monster{ Name : "牛魔王" , Age : 500, Birthday : "2011-11-11" , Sal : 8000.0, Skill : "牛魔拳" , } //将 monster 序列化 data, err := json.Marshal(&monster) if err != nil { fmt.Printf( "序列号错误 err=%v\n" , err) } //输出序列化后的结果 fmt.Printf( "monster 序列化后=%v\n" , string(data)) } //将 map 进行序列化 func testMap() { //定义一个 map var a map [string] interface {} //使用 map,需要 make a = make( map [string] interface {}) a[ "name" ] = "红孩儿" a[ "age" ] = 30 a[ "address" ] = "洪崖洞" //将 a 这个 map 进行序列化 //将 monster 序列化 data, err := json.Marshal(a) if err != nil { fmt.Printf( "序列化错误 err=%v\n" , err) } //输出序列化后的结果 fmt.Printf( "a map 序列化后=%v\n" , string(data)) } //演示对切片进行序列化, 我们这个切片 []map[string]interface{} func testSlice() { var slice [] map [string] interface {} var m1 map [string] interface {} //使用 map 前,需要先 make m1 = make( map [string] interface {}) m1[ "name" ] = "jack" m1[ "age" ] = "7" m1[ "address" ] = "北京" slice = append(slice, m1) var m2 map [string] interface {} //使用 map 前,需要先 make m2 = make( map [string] interface {}) m2[ "name" ] = "tom" m2[ "age" ] = "20" m2[ "address" ] = [2]string{ "墨西哥" , "夏威夷" } slice = append(slice, m2) //将切片进行序列化操作 data, err := json.Marshal(slice) if err != nil { fmt.Printf( "序列化错误 err=%v\n" , err) } //输出序列化后的结果 fmt.Printf( "slice 序列化后=%v\n" , string(data)) } //对基本数据类型序列化,对基本数据类型进行序列化意义不大 func testFloat64() { var num1 float64 = 2345.67 //对 num1 进行序列化 data, err := json.Marshal(num1) if err != nil { fmt.Printf( "序列化错误 err=%v\n" , err) } //输出序列化后的结果 fmt.Printf( "num1 序列化后=%v\n" , string(data)) } func main() { //演示将结构体, map , 切片进行序列号 testStruct() testMap() testSlice() //演示对切片的序列化 testFloat64() //演示对基本数据类型的序列化 } |
注意事项
对于结构体的序列化,如果我们希望序列化后的key 的名字,又我们自己重新制定,那么可以给struct指定一个 tag 标签.
序列化后:
{"monster_name":"牛魔王","monster_age":500,"Birthday":"2011-11-11","Sal":8000,"Skill":"牛魔拳"}
json 的反序列化基本介绍
json 反序列化是指,将 json 字符串反序列化成对应的数据类型(比如结构体、map、切片)的操作
应用案例
这里我们介绍一下将 json 字符串反序列化成结构体、map 和切片代码演示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | package main import ( "fmt" "encoding/json" ) //定义一个结构体 type Monster struct { Name string Age int Birthday string //.... Sal float64 Skill string } //演示将 json 字符串,反序列化成 struct func unmarshalStruct() { //说明 str 在项目开发中,是通过网络传输获取到.. 或者是读取文件获取到 str := "{\"Name\":\"牛魔王\",\"Age\":500,\"Birthday\":\"2011-11-11\",\"Sal\":8000,\"Skill\":\"牛魔拳\"}" //定义一个 Monster 实例 var monster Monster err := json.Unmarshal([]byte(str), &monster) if err != nil { fmt.Printf( "unmarshal err=%v\n" , err) } fmt.Printf( "反序列化后 monster=%v monster.Name=%v \n" , monster, monster.Name) } //演示将 json 字符串,反序列化成 map func unmarshalMap() { str := "{\"address\":\"洪崖洞\",\"age\":30,\"name\":\"红孩儿\"}" //定义一个 map var a map [string] interface {} //反序列化 //注意:反序列化 map,不需要 make,因为 make 操作被封装到 Unmarshal 函数 err := json.Unmarshal([]byte(str), &a) if err != nil { fmt.Printf( "unmarshal err=%v\n" , err) } fmt.Printf( "反序列化后 a=%v\n" , a) } //演示将 json 字符串,反序列化成切片 func unmarshalSlice() { str := "[{\"address\":\"北京\",\"age\":\"7\",\"name\":\"jack\"}," + "{\"address\":[\"墨西哥\",\"夏威夷\"],\"age\":\"20\",\"name\":\"tom\"}]" //定义一个 slice var slice [] map [string] interface {} //反序列化,不需要 make,因为 make 操作被封装到 Unmarshal 函数 err := json.Unmarshal([]byte(str), &slice) if err != nil { fmt.Printf( "unmarshal err=%v\n" , err) } fmt.Printf( "反序列化后 slice=%v\n" , slice) } func main() { unmarshalStruct() unmarshalMap() unmarshalSlice() } |
对上面代码的小结说明
1)在反序列化一个json 字符串时,要确保反序列化后的数据类型和原来序列化前的数据类型一致。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?