php json 存储数据格式,文件存储(一):通过 JSON 格式序列化文本数据
文件存储(一):通过 JSON 格式序列化文本数据
由 学院君 创建于6个月前, 最后更新于 2个月前
版本号 #4
737 views
0 likes
0 collects
内存存储性能虽好,但是无法持久化存储,并且容量也是有限的,要将大块数据永久保存起来,还是需要借助文件系统和数据库。我们先来看文件存储。
存储数据到文件系统有两种方式,一种是文本格式,比如 CSV、JSON 格式文件,一种是二进制格式,比如 Gob。接下来我们通过三篇教程的篇幅分别进行演示。
首先来看如何通过 JSON 格式保存数据到文件。
我们在上篇教程中已经演示过如何在内存中通过 Go 提供的数据类型处理数据。如果要将处理后的数据保存到文件系统,对于基本类型而言(数字、字符串)直接写入文件即可,而对于数组、切片、字典、结构体这种复合类型,Go 语言官方没有像 PHP 那样直接提供序列化函数,我们可以通过 JSON 编码将其转化为 JSON 格式字符串写入文件(序列化),后面需要用到它们从文件中读取后,可以通过 JSON 解码再将其转化为原来的数据类型(反序列化)。
下面,我们编写一段示例代码 json.go 进行演示:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
)
// 存放文章信息的 Post 结构体
type Book struct {
Id int `json:"id"`
Title string `json:"title"`
Summary string `json:"summary"`
Author string `json:"author"`
}
func main() {
// 初始化一个字典类型变量
var books map[int]*Book = make(map[int]*Book)
book1 := Book{Id: 1, Title: "Go Web 编程", Summary: "Go Web 编程入门指南", Author: "学院君"}
books[book1.Id] = &book1
// 通过 JSON 序列化字典数据
data, _ := json.Marshal(books)
// 将 JSON 格式数据写入当前目录下的 books 文件(文件不存在会自动创建)
err := ioutil.WriteFile("books", data, 0644)
if err != nil {
panic(err)
}
// 从文件 books 中读取数据
dataEncoded, _ := ioutil.ReadFile("books")
// 将读取到的数据通过 JSON 解码反序列化为原来的数据类型
var booksDecoded map[int]*Book
json.Unmarshal(dataEncoded, &booksDecoded)
fmt.Printf("%#v", booksDecoded[book1.Id])
}
执行上述代码,输出结果如下,说明 JSON 解码成功:
此外,我们还可以在当前目录下看到新生成了一个 books 文件,文件内容如下:
{"1":{"id":1,"title":"Go Web 编程","summary":"Go Web 编程入门指南","author":"学院君"}}
由此可见,我们已经成功通过 JSON 实现了文本格式数据的序列化和反序列化。
另外,读写文件除了使用 ioutil 包之外,还可以使用 os 包提供的函数,前者更加方便,后者则更加底层,支持的操作和功能更多:
package main
import (
"encoding/json"
"fmt"
"os"
)
// 存放文章信息的 Post 结构体
type Book struct {
Id int `json:"id"`
Title string `json:"title"`
Summary string `json:"summary"`
Author string `json:"author"`
}
func main() {
// 初始化一个字典类型变量
var books map[int]*Book = make(map[int]*Book)
book1 := Book{Id: 1, Title: "Go Web 编程", Summary: "Go Web 编程入门指南", Author: "学院君"}
books[book1.Id] = &book1
// 通过 JSON 序列化字典数据
data, _ := json.Marshal(books)
// 将 JSON 格式数据写入当前目录下的 books 文件
// err := ioutil.WriteFile("books", data, 0644)
file1, _ := os.Create("books")
defer file1.Close()
_, err := file1.Write(data)
if err != nil {
panic(err)
}
// 从文件 books 中读取数据
//dataEncoded, _ = ioutil.ReadFile("books")
file2, _ := os.Open("books")
defer file2.Close()
dataEncoded := make([]byte, len(data))
file2.Read(dataEncoded)
// 将读取到的数据通过 JSON 解码反序列化为原来的数据类型
var booksDecoded map[int]*Book
json.Unmarshal(dataEncoded, &booksDecoded)
fmt.Printf("%#v", booksDecoded[book1.Id])
}
注:可将两种文件读写方式类比为 PHP 中的 file_get_contents/file_put_contents 函数与通过 fopen 函数获取文件句柄进行文件读写操作。
运行上述代码,结果和之前完全一致:
php json 存储数据格式,文件存储(一):通过 JSON 格式序列化文本数据相关推荐
- 对象存储与块存储、文件存储等对比
看到 一篇文档, 讲 对象存储, 好奇,搜索文章,摘抄,学习记录 ! 背景: 传统存储在面对海量非结构化数据时,在存储.分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结构化内容设 ...
- 块存储、文件存储、对象存储这三者和分布式文件存储系统的本质区别
块存储和文件存储是我们比较熟悉的两种主流的存储类型,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based St ...
- 如何修改xd.properties文件中对象存储文件信息_对块存储、文件存储、对象存储的认识总结...
因工作原因接触了对象存储,从而了解到相关的块存储和文件存储.搜罗了网上各种信息,结合自己的理解,整理如下.欢迎阅读,批评指正. 开头引用下几篇关于"块存储.文件存储.对象存储"的文 ...
- Android数据存储之文件存储(瞬时数据的存储与读取)项目已上传GitHub
GitHub地址: https://github.com/Skymqq/FileSave.git 数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然 ...
- 天翼云从业认证(1.2)存储的概念、体系结构、块存储、对象存储、文件存储以及 RAID 磁盘管理技术
(1)块存储.对象存储.文件存储 存储方式 技术实现 优势 劣势 代表作 块存储 裸盘上划分逻辑卷,逻辑卷格式化成任意文件系统 支持多种文件系统,传输速度快,提供硬件容错机制 无法实现网络共享 FC- ...
- mysql存储文件用什么类型_块存储、文件存储、对象存储的区别是什么?
块存储: 需要实现Linux的Block Device的接口或者QEMU提供的Block Driver接口.提供随机读写,可以像使用物理硬盘一样格式化并建立文件系统来使用块存储,块存储可用于绝大部分通 ...
- 块存储、文件存储、对象存储意义及差异
关于块存储.文件存储.对象存储方面的知识在知乎上看到了个很好的解答:https://www.zhihu.com/question/21536660 通俗易懂,查了些资料做了详细的补充. 块存储 典型设 ...
- 4 读写文件_块存储、文件存储、对象存储的区别
1. 块存储 典型设备: 磁盘阵列,硬盘 块存储主要是将裸磁盘空间整个映射给主机使用的,就是说例如磁盘阵列里面有5块硬盘(为方便说明,假设每个硬盘1G),然后可以通过划逻辑盘.做Raid.或者LV ...
- java中sofa并发访问,云上的日子:用块存储、文件存储还是对象存储?
当今最流行的存储类型是哪种? 答案毫无疑问是:块存储.文件存储还有对象存储!作为伴随着云计算兴起的存储类型,这三种存储绝对是这个时代的存储明星,用C位出道来形容再合适不过. 那么,在云上的日子,究竟该 ...
- 块存储,文件存储,对象存储
前言:根据不同的分类方式,存储也会被分成不同的类型,但是用途是一致的:存储的最终目的是存放数据. 存储的分类方式: 1.本地存储,外地存储 本地存储:就是你电脑里面内置的存储设备,比如:系统盘,机械盘 ...
最新文章
- LPC43xx双核笔记
- c# async await 理解 结合并行处理
- C代码中的命名方式总结和改进
- IBASE component valid to field
- 选购计算机五个原则,双十一笔记本电脑推荐
- centos oracle sqlplus,centos 下oracle sqlplus乱码问题解决
- QT中QTableWidget清空或删除内容功能
- struct、union、enum and sizeof
- 20200410:路径总和 Ⅰ Ⅱ(leetcode112 /113)
- web前端入门:CSS 样式书写规范
- 透析QTP自动化测试框架SAFFRON
- 扩展频谱--直接序列扩频
- LINGO语法及软件操作
- 百度云大文件高速下载方法、软件
- python井字格游戏_python实现简单井字棋游戏
- 如何利用jqGrid表格方法重新设置caption属性值
- ThreadLocal不好用?那是你没用对!
- 数据中台产品经理-读书笔记3
- 以 VS Code为例,看大型开源项目是如何应用软件工程的?
- UG导出CAD图纸的方法
热门文章
- ntpdate 时间同步
- https 带端口_基于scapy模块的8种端口扫描
- ajax如何传两个不同的参数,ajax 如何从后台传多个data对象(多个参数)string类型的...
- python语言程序设计 陈东_清华大学出版社-图书详情-《Python语言程序设计》
- Centos7.x 安装JDK、Jenkins、Jmeter、ant
- fastJson、Jackson对象转json串不使用驼峰方法和json转对象
- 尚硅谷JVM笔记(宋红康主讲)
- Docker容器中bash: ip: command not found
- iOS:懒加载符号绑定流程
- [JavaScript语法学习]重新认识JavaScript