Go语言基础Json序列化反序列化及文件读写示例详解
来源:脚本之家
时间:2022-12-30 17:43:59 196浏览 收藏
IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Go语言基础Json序列化反序列化及文件读写示例详解》,聊聊文件读写、反序列化、语言JSON,我们一起来看看吧!
概述
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的、键值对的数据交换格式。结构由大括号'{}',中括号'[]',逗号',',冒号';',双引号'""'组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等。
JSON序列化
将Go语言原数据转换成JSON格式字符串
语法:
1 2 | //传map,结构体,slice...,返回结果byte切片和error是否错误 func Marshal(v interface{}) ([]byte, error) |
结构体转JSON
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | type Person struct{ Name string //姓名 Age int //年龄 Sex rune //性别 Hobby []string //爱好 Money float64 //钱 } person:=Person{Name:"张三",Age:18,Sex:'男',Hobby:[]string{"听音乐","看书","打篮球"},Money:18.62} if bytes,err:=json.Marshal(person);err!=nil{ fmt.Println("编码错误",err) }else{ //{"Name":"张三","Age":18,"Sex":30007,"Hobby":["听音乐","看书","打篮球"],"Money":18.62} fmt.Println("编码成功:",string(bytes)) } |
map转JSON
1 2 3 4 5 6 7 8 9 | p:=make(map[string]interface{},0) p["0"]=map[string]interface{}{"name":"张三","age":18,"sex":'男',"hobby":[]string{"听音乐","看书","打篮球"},"money":18.62} p["1"]=map[string]interface{}{"name":"李四","age":19,"sex":'女',"hobby":[]string{"听音乐","看电影","打足球"},"money":1.62} if bytes,err:=json.Marshal(p);err!=nil{ fmt.Println("编码错误",err) }else{ fmt.Println(string(bytes)) } |
切片转JSON
1 2 3 4 5 6 7 8 9 10 | p:=make([]map[string]interface{},0) p1:=map[string]interface{}{"name":"张三","age":18,"sex":'男',"hobby":[]string{"听音乐","看书","打篮球"},"money":18.62} p2:=map[string]interface{}{"name":"李四","age":19,"sex":'女',"hobby":[]string{"听音乐","看电影","打足球"},"money":1.62} p=append(p,p1,p2) if bytes,err:=json.Marshal(p);err!=nil{ fmt.Println("编码错误",err) }else{ fmt.Println(string(bytes)) } |
JSON反序列化
将JSON格式字符串转换成Go语言原数据
1 2 | //传入JSON字符串的byte字节和Go接收数据的类型指针,返回err错误,是否返回成功 func Unmarshal(data []byte, v interface{}) error |
JSON转map
1 2 3 4 5 6 7 | str:=`{"Name":"张三","Age":18,"Sex":30007,"Hobby":["听音乐","看书","打篮球"],"Money":18.62}` p:=make(map[string]interface{}, 0) if err:=json.Unmarshal([]byte(str),&p);err!=nil{ fmt.Println("解码失败",err) }else{ fmt.Println("解析成功",p) } |
JSON转结构体
1 2 3 4 5 6 7 | str:=`{"Name":"张三","Age":18,"Sex":30007,"Hobby":["听音乐","看书","打篮球"],"Money":18.62}` var p Person if err:=json.Unmarshal([]byte(str),&p);err!=nil{ fmt.Println("解码失败",err) }else{ fmt.Println("解析成功",p) } |
JSON转切片
1 2 3 4 5 6 7 8 | str:=`[{"Hobby":["听音乐","看书","打篮球"]}]` p:=make([]map[string]interface{}, 0) if err:=json.Unmarshal([]byte(str),&p);err!=nil{ fmt.Println("解码失败",err) }else{ fmt.Println("解析成功",p) } |
写JSON文件
将Go语言源数据写入到json文件
1 2 3 4 5 6 7 8 9 10 | //第一步 传文件的路径,返回文件的可读可写,error:是否成功 //flag:文件标识:是创建还是,追加...... //parm:文件模式表示文件的模式和权限位,通常,请求的模式为 0666,它使该文件可由任何人读和写 func OpenFile(name string, flag int, perm FileMode) (*File, error) 或者 func Create(name string) (*File, error) //传入文件的名字,返回文件的对象和error是否成功 //第二步 传文件对象,返回一个从w读取的新编码器 func NewEncoder(w io.Writer) *Encoder //第三步 编码器将v写入流中,后换行 func (enc *Encoder) Encode(v interface{}) error |
map写入JSON文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | p:=make(map[string]interface{}, 0) p["name"]="张三" p["age"]=18 p["sex"]='男' p["hobby"]=[]string{"听英语","看书"} p["money"]=15.63 if distFile,err:=os.OpenFile("map.json",os.O_CREATE,0666);err!=nil{ fmt.Println("创建文件失败",err) }else { enc:=json.NewEncoder(distFile) if err:=enc.Encode(p);err!=nil { fmt.Println("写入文件失败", err) }else{ fmt.Println("写入文件成功") } } |
切片写入JSON文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | p:=make([]map[string]interface{}, 0) p1:=map[string]interface{}{"name":"张三","age":18,"sex":'男',"hobby":[]string{"听书","看电视"},"money":15.84} p2:=map[string]interface{}{"name":"李四","age":20,"sex":'女',"hobby":[]string{"打篮球","看书"},"money":125.84} p=append(p,p1,p2) if distFile,err:=os.OpenFile("slice.json",os.O_CREATE,0666);err!=nil{ fmt.Println("创建slice文件失败", err) }else { enc:=json.NewEncoder(distFile) if err:=enc.Encode(p);err!=nil{ fmt.Println("写入slice 文件失败", err) }else{ fmt.Println("写入slice 文件成功") } } |
结构体写入JSON文件
1 2 3 4 5 6 7 8 9 10 11 | p:=Person{Name:"张三",Age:18,Sex:'男',Hobby:[]string{"听英语","读书"},Money:15.35} if distFile,err:=os.OpenFile("张三.json",os.O_CREATE|os.O_APPEND,0666);err!=nil{ fmt.Println("创建文件失败",err) }else{ enc:=json.NewEncoder(distFile) if err:=enc.Encode(&p);err!=nil { fmt.Println("写入文件失败",err) }else { fmt.Println("写入文件成功") } } |
读JSON文件
将json文件转换成Go语言源数据
1 2 3 4 5 6 | //第一步 传文件的路径,返回文件的可读可写,error:是否成功 func Open(name string) (*File, error) //第二步 传文件对象,返回一个从r读取的新解码器 func NewDecoder(r io.Reader) *Decoder //第三步 解码器将值存储在v值中 func (dec *Decoder) Decode(v interface{}) error |
解码JSON文件为map
1 2 3 4 5 6 7 8 9 10 11 | p:=make(map[string]interface{}, 0) if srcFile,err:=os.Open("map.json");err!=nil{ fmt.Println("打开map 文件失败",err) }else{ en:=json.NewDecoder(srcFile) if err:=en.Decode(&p);err!=nil{ fmt.Println("读入map 文件失败",err) }else { fmt.Println("读取map 文件成功",p) } } |
解码JSON文件为切片
1 2 3 4 5 6 7 8 9 10 11 | p:=make([]map[string]interface{}, 0) if srcFile,err:=os.Open("slice.json");err!=nil{ fmt.Println("打开slice 文件失败", err) }else{ en:=json.NewDecoder(srcFile) if err:=en.Decode(&p);err!=nil{ fmt.Println("读入slice 文件失败", err) }else { fmt.Println("读取slice 文件成功", p) } } |
解码JSON文件为结构体
1 2 3 4 5 6 7 8 9 10 11 | var p =new(Person) if srcFile,err:=os.Open("struct.json");err!=nil{ fmt.Println("打开struct 文件失败", err) }else{ en:=json.NewDecoder(srcFile) if err:=en.Decode(&p);err!=nil{ fmt.Println("读入struct 文件失败", err) }else{ fmt.Println("读取struct 文件成功", *p) } } |
示例
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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 | package main import ( "encoding/json" "fmt" "os" ) type Person struct { Name string //姓名 Age int //年龄 Sex rune //性别 Hobby []string //爱好 Money float64 //钱 } func main() { fmt.Println("---------------JSON序列化----------") //JSON序列化 //结构体 marshalStrut() //map marshalMap() //slice marshalSlice() fmt.Println("\n", "---------------JSON反序列化----------", "\n") //JSON反序列化 //map unmarshalMap() //struct unmarshalStruct() //slice unmarshalSlice() fmt.Println("\n", "---------------写JSON文件----------", "\n") //结构体 writeStructFile() //map writeMapFile() //slice writeSliceFile() fmt.Println("\n", "---------------读JSON文件----------", "\n") //struct readStructFile() //map readMapFile() //slice readSliceFile() } /************************序列化*********************/ func marshalStrut() { person := Person{Name: "张三", Age: 18, Sex: '男', Hobby: []string{"听音乐", "看书", "打篮球"}, Money: 18.62} if bytes, err := json.Marshal(person); err != nil { fmt.Println("结构体序列化错误", err) } else { //{"Name":"张三","Age":18,"Sex":30007,"Hobby":["听音乐","看书","打篮球"],"Money":18.62} fmt.Println("结构体序列化成功:", string(bytes)) } } func marshalMap() { p := make(map[string]interface{}, 0) p["0"] = map[string]interface{}{"name": "张三", "age": 18, "sex": '男', "hobby": []string{"听音乐", "看书", "打篮球"}, "money": 18.62} p["1"] = map[string]interface{}{"name": "李四", "age": 19, "sex": '女', "hobby": []string{"听音乐", "看电影", "打足球"}, "money": 1.62} if bytes, err := json.Marshal(p); err != nil { fmt.Println("map 序列化错误", err) } else { // {"0":{"age":18,"hobby":["听音乐","看书","打篮球"],"money":18.62,"name":"张三","sex":30007},"1":{"age":19,"hobby":["听音乐","看电影","打足球"],"money":1.62,"name":"李四","sex":22899}} fmt.Println("map 序列化成功", string(bytes)) } } func marshalSlice() { p := make([]map[string]interface{}, 0) p1 := map[string]interface{}{"name": "张三", "age": 18, "sex": '男', "hobby": []string{"听音乐", "看书", "打篮球"}, "money": 18.62} p2 := map[string]interface{}{"name": "李四", "age": 19, "sex": '女', "hobby": []string{"听音乐", "看电影", "打足球"}, "money": 1.62} p = append(p, p1, p2) if bytes, err := json.Marshal(p); err != nil { fmt.Println("slice 序列化错误", err) } else { // [{"age":18,"hobby":["听音乐","看书","打篮球"],"money":18.62,"name":"张三","sex":30007},{"age":19,"hobby":["听音乐","看电影","打足球"],"money":1.62,"name":"李四","sex":22899}] fmt.Println("slice 序列化成功", string(bytes)) } } /************************反序列化*********************/ func unmarshalMap() { str := `{"Name":"张三","Age":18,"Sex":30007,"Hobby":["听音乐","看书","打篮球"],"Money":18.62}` p := make(map[string]interface{}, 0) if err := json.Unmarshal([]byte(str), &p); err != nil { fmt.Println("map 反序列化失败", err) } else { //map[Age:18 Hobby:[听音乐 看书 打篮球] Money:18.62 Name:张三 Sex:30007] fmt.Println("map 反序列化成功", p) } } func unmarshalStruct() { str := `{"Name":"张三","Age":18,"Sex":30007,"Hobby":["听音乐","看书","打篮球"],"Money":18.62}` var p Person if err := json.Unmarshal([]byte(str), &p); err != nil { fmt.Println("struct 反序列化失败", err) } else { //{张三 18 30007 [听音乐 看书 打篮球] 18.62} fmt.Println("struct 反序列化成功", p) } } func unmarshalSlice() { str := `[{"Hobby":["听音乐","看书","打篮球"]},{"Hobby":["听书","看书","打足球"]}]` p := make([]map[string]interface{}, 0) if err := json.Unmarshal([]byte(str), &p); err != nil { fmt.Println("slice 反序列化失败", err) } else { // [map[Hobby:[听音乐 看书 打篮球]]] fmt.Println("slice 反序列化成功", p) } } /************************写JSON文件*********************/ func writeStructFile() { p := Person{Name: "张三", Age: 18, Sex: '男', Hobby: []string{"听英语", "读书"}, Money: 15.35} if distFile, err := os.OpenFile("struct.json", os.O_CREATE|os.O_TRUNC, 0666); err != nil { fmt.Println("创建struct文件失败", err) } else { enc := json.NewEncoder(distFile) if err := enc.Encode(&p); err != nil { fmt.Println("写入struct文件失败", err) } else { fmt.Println("写入struct文件成功") } } } func writeMapFile() { p := make(map[string]interface{}, 0) p["name"] = "张三" p["age"] = 18 p["sex"] = '男' p["hobby"] = []string{"听英语", "看书"} p["money"] = 15.63 if distFile, err := os.OpenFile("map.json", os.O_CREATE, 0666); err != nil { fmt.Println("创建map 文件失败", err) } else { enc := json.NewEncoder(distFile) if err := enc.Encode(p); err != nil { fmt.Println("写入map文件失败", err) } else { fmt.Println("写入map 文件成功") } } } func writeSliceFile() { p := make([]map[string]interface{}, 0) p1 := map[string]interface{}{"name": "张三", "age": 18, "sex": '男', "hobby": []string{"听书", "看电视"}, "money": 15.84} p2 := map[string]interface{}{"name": "李四", "age": 20, "sex": '女', "hobby": []string{"打篮球", "看书"}, "money": 125.84} p = append(p, p1, p2) if distFile, err := os.OpenFile("slice.json", os.O_CREATE, 0666); err != nil { fmt.Println("创建slice文件失败", err) } else { enc := json.NewEncoder(distFile) if err := enc.Encode(p); err != nil { fmt.Println("写入slice 文件失败", err) } else { fmt.Println("写入slice 文件成功") } } } /************************读JSON文件*********************/ func readStructFile() { var p = new(Person) if err := readFile("struct.json", "打开struct 文件失败", &p); err != nil { fmt.Println("读入struct 文件失败", err) } else { fmt.Println("读取struct 文件成功", *p) } } func readMapFile() { p := make(map[string]interface{}, 0) if err := readFile("map.json", "打开map 文件失败", &p); err != nil { fmt.Println("读取map 文件失败", err) } else { fmt.Println("读取map 文件成功", p) } } func readSliceFile() { p := make([]map[string]interface{}, 0) if err := readFile("slice.json", "打开slice 文件失败", &p); err != nil { fmt.Println("读入slice 文件失败", err) } else { fmt.Println("读取slice 文件成功", p) } } //封装 func readFile(f string, c string, v interface{}) error { if srcFile := openFile(f, c); srcFile != nil { en := json.NewDecoder(srcFile) if err := en.Decode(v); err != nil { return err } } return nil } func openFile(f string, c string) *os.File { if srcFile, err := os.Open(f); err != nil { fmt.Println(c, err) } else { return srcFile } return nil } |
今天关于《Go语言基础Json序列化反序列化及文件读写示例详解》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!
声明:本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
-
301 收藏
-
487 收藏
-
446 收藏
-
313 收藏
-
306 收藏
最新阅读
更多>
-
355 收藏
-
462 收藏
-
260 收藏
-
103 收藏
-
297 收藏
-
463 收藏
-
218 收藏
-
133 收藏
-
214 收藏
-
444 收藏
-
463 收藏
-
176 收藏
课程推荐
更多>
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习