Go语言基础Json序列化反序列化及文件读写示例详解
来源:脚本之家
2022-12-30 17:43:59
0浏览
收藏
IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《Go语言基础Json序列化反序列化及文件读写示例详解》,聊聊文件读写、反序列化、语言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 Person
if 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"]=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文件
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 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删除
Go语言基础反射示例详解
- 上一篇
- Go语言基础反射示例详解
- 下一篇
- Go语言基础闭包的原理分析示例详解
评论列表
-
- 帅气的小土豆
- 这篇技术文章太及时了,太全面了,受益颇多,已收藏,关注老哥了!希望老哥能多写Golang相关的文章。
- 2023-04-29 09:20:36
-
- 谦让的板凳
- 赞 ??,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢老哥分享文章内容!
- 2023-02-02 00:23:30
-
- 优秀的水杯
- 太全面了,mark,感谢作者的这篇技术文章,我会继续支持!
- 2023-01-09 19:24:58
查看更多
最新文章
-
- Golang · Go教程 | 2小时前 | 并发 · Go教程 · trace.NewTask go tool trace Go runtime/trace 执行跟踪 trace.WithRegion
- Go runtime/trace 怎样按任务标记跟踪区间
- 391浏览 收藏
-
- Golang · Go教程 | 3小时前 | flag · go · Go 命令行参数 flag.TextVar encoding.TextUnmarshaler
- Go flag.TextVar 怎样把自定义类型接入命令行
- 184浏览 收藏
-
- Golang · Go教程 | 4小时前 | 错误处理 · 模板 · Go教程 · html/template · 模板渲染 Go html/template missingkey 模板缺失字段 Execute错误
- Go html/template 缺失字段的严格渲染配置与错误处理
- 371浏览 收藏
-
- Golang · Go教程 | 4小时前 | html · go · 模板 · url · Go html/template 自动转义 URL上下文 template.URL
- Go html/template 怎样避免 URL 上下文误用
- 326浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Go text/template.ParseFS 怎样加载嵌入文件模板
- 208浏览 收藏
-
- Golang · Go教程 | 4小时前 |
- Go database/sql.NamedArg 怎样给 SQL 参数命名
- 311浏览 收藏
-
- Golang · Go教程 | 4小时前 | HTTP · go · Gin · Gin ShouldBindBodyWith 请求体重复绑定 ShouldBind binding.JSON
- Gin ShouldBindBodyWith 怎么让同一个请求体绑定两次
- 134浏览 收藏
-
- Golang · Go教程 | 5小时前 | go · 文件系统 · Go os.ReadDir Go File.ReadDir Go DirEntry Go 目录遍历
- Go os.ReadDir 怎样高效读取目录条目
- 269浏览 收藏
-
- Golang · Go教程 | 5小时前 | go · Go go/types.Config Go Importer Go 类型检查 types.Check
- Go go/types.Config 怎样给类型检查接入导入器
- 222浏览 收藏
-
- Golang · Go教程 | 5小时前 |
- Go maphash.Hash 怎样用固定种子复现哈希结果
- 341浏览 收藏
-
- Golang · Go教程 | 6小时前 | Go 字节切片 encoding/binary AppendByteOrder
- Go binary.ByteOrder.Append 怎样把整数追加到现有字节切片
- 373浏览 收藏
-
- Golang · Go教程 | 6小时前 | go · IPv6 Go ipv4 netip.ParsePrefix CIDR
- Go netip.ParsePrefix 怎样解析 CIDR 字符串
- 334浏览 收藏
查看更多
课程推荐
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
查看更多
AI推荐
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 561次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 606次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 635次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 593次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 414次使用
查看更多
相关文章
-
- Go语言文件开关及读写操作示例
- 2023-02-24 301浏览
-
- Go语言对JSON数据进行序列化和反序列化
- 2023-01-07 487浏览
-
- Go语言实现JSON解析的方法详解
- 2023-01-09 446浏览
-
- Golang中Json的序列化和反序列化的使用
- 2022-12-29 313浏览
-
- golang:json 反序列化的[]和nil操作
- 2023-02-16 306浏览

