Go语言中Json序列化反序列化及文件读写的示例分析
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,这篇文章主要介绍Go语言中Json序列化反序列化及文件读写的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述JSON(JavaScript Object Notati
千家信息网最后更新 2025年01月22日Go语言中Json序列化反序列化及文件读写的示例分析
这篇文章主要介绍Go语言中Json序列化反序列化及文件读写的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
概述
JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的、键值对的数据交换格式。结构由大括号'{}',中括号'[]',逗号',',冒号';',双引号'""'组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等。
JSON序列化
将Go语言原数据转换成JSON格式字符串
语法:
//传map,结构体,slice...,返回结果byte切片和error是否错误func Marshal(v interface{}) ([]byte, error)
结构体转JSON
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
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
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语言原数据
//传入JSON字符串的byte字节和Go接收数据的类型指针,返回err错误,是否返回成功func Unmarshal(data []byte, v interface{}) error
JSON转map
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转结构体
str:=`{"Name":"张三","Age":18,"Sex":30007,"Hobby":["听音乐","看书","打篮球"],"Money":18.62}`var p Personif err:=json.Unmarshal([]byte(str),&p);err!=nil{ fmt.Println("解码失败",err)}else{ fmt.Println("解析成功",p)}
JSON转切片
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文件
//第一步 传文件的路径,返回文件的可读可写,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文件
p:=make(map[string]interface{}, 0)p["name"]="张三"p["age"]=18p["sex"]='男'p["hobby"]=[]string{"听英语","看书"}p["money"]=15.63if 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文件
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文件
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语言源数据
//第一步 传文件的路径,返回文件的可读可写,error:是否成功func Open(name string) (*File, error)//第二步 传文件对象,返回一个从r读取的新解码器func NewDecoder(r io.Reader) *Decoder//第三步 解码器将值存储在v值中func (dec *Decoder) Decode(v interface{}) error
解码JSON文件为map
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文件为切片
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文件为结构体
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) }}
示例
package mainimport ( "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序列化反序列化及文件读写的示例分析"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
文件
成功
音乐
序列
张三
篮球
结构
错误
李四
数据
足球
语言
看电影
编码
对象
英语
示例
字符
字符串
格式
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
福建邮电计算机网络技术
软件开发项目中介服务合同
网络技术人员招聘试题
南通美阜互联网科技有限公司
rand函数数据库
我的世界免费简单开服务器方法
软件开发整体性原则
中信证券软件开发中心
原神历史深渊数据库
网络安全词语猜灯谜
郑州学习软件开发收费多少
用友数据库611与539
计算机网络技术就业调查报告
思科网络技术有哪些
app 数据库文件
附加数据库时出错5133
软件开发公司薪资待遇基准
数据库监听器启动
数据库句号的作用
网络安全生产工作机制
残联系统网络安全手册
云服务器如何连接本机
北京恒星软件开发
宋首友 网络安全
游戏软件开发需要考什么证
客户端通过什么找到服务器
芜湖联想服务器安装
饥荒服务器盒子
服务器管理65536个
做小程序软件开发