文件存储(一):通过 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 格式序列化文本数据相关推荐

  1. 对象存储与块存储、文件存储等对比

    看到 一篇文档, 讲 对象存储, 好奇,搜索文章,摘抄,学习记录 ! 背景: 传统存储在面对海量非结构化数据时,在存储.分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结构化内容设 ...

  2. 块存储、文件存储、对象存储这三者和分布式文件存储系统的本质区别

    块存储和文件存储是我们比较熟悉的两种主流的存储类型,而对象存储(Object-based Storage)是一种新的网络存储架构,基于对象存储技术的设备就是对象存储设备(Object-based St ...

  3. 如何修改xd.properties文件中对象存储文件信息_对块存储、文件存储、对象存储的认识总结...

    因工作原因接触了对象存储,从而了解到相关的块存储和文件存储.搜罗了网上各种信息,结合自己的理解,整理如下.欢迎阅读,批评指正. 开头引用下几篇关于"块存储.文件存储.对象存储"的文 ...

  4. Android数据存储之文件存储(瞬时数据的存储与读取)项目已上传GitHub

    GitHub地址: https://github.com/Skymqq/FileSave.git 数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然 ...

  5. 天翼云从业认证(1.2)存储的概念、体系结构、块存储、对象存储、文件存储以及 RAID 磁盘管理技术

    (1)块存储.对象存储.文件存储 存储方式 技术实现 优势 劣势 代表作 块存储 裸盘上划分逻辑卷,逻辑卷格式化成任意文件系统 支持多种文件系统,传输速度快,提供硬件容错机制 无法实现网络共享 FC- ...

  6. mysql存储文件用什么类型_块存储、文件存储、对象存储的区别是什么?

    块存储: 需要实现Linux的Block Device的接口或者QEMU提供的Block Driver接口.提供随机读写,可以像使用物理硬盘一样格式化并建立文件系统来使用块存储,块存储可用于绝大部分通 ...

  7. 块存储、文件存储、对象存储意义及差异

    关于块存储.文件存储.对象存储方面的知识在知乎上看到了个很好的解答:https://www.zhihu.com/question/21536660 通俗易懂,查了些资料做了详细的补充. 块存储 典型设 ...

  8. 4 读写文件_块存储、文件存储、对象存储的区别

    1. 块存储 典型设备: 磁盘阵列,硬盘 ​ 块存储主要是将裸磁盘空间整个映射给主机使用的,就是说例如磁盘阵列里面有5块硬盘(为方便说明,假设每个硬盘1G),然后可以通过划逻辑盘.做Raid.或者LV ...

  9. java中sofa并发访问,云上的日子:用块存储、文件存储还是对象存储?

    当今最流行的存储类型是哪种? 答案毫无疑问是:块存储.文件存储还有对象存储!作为伴随着云计算兴起的存储类型,这三种存储绝对是这个时代的存储明星,用C位出道来形容再合适不过. 那么,在云上的日子,究竟该 ...

  10. 块存储,文件存储,对象存储

    前言:根据不同的分类方式,存储也会被分成不同的类型,但是用途是一致的:存储的最终目的是存放数据. 存储的分类方式: 1.本地存储,外地存储 本地存储:就是你电脑里面内置的存储设备,比如:系统盘,机械盘 ...

最新文章

  1. LPC43xx双核笔记
  2. c# async await 理解 结合并行处理
  3. C代码中的命名方式总结和改进
  4. IBASE component valid to field
  5. 选购计算机五个原则,双十一笔记本电脑推荐
  6. centos oracle sqlplus,centos 下oracle sqlplus乱码问题解决
  7. QT中QTableWidget清空或删除内容功能
  8. struct、union、enum and sizeof
  9. 20200410:路径总和 Ⅰ Ⅱ(leetcode112 /113)
  10. web前端入门:CSS 样式书写规范
  11. 透析QTP自动化测试框架SAFFRON
  12. 扩展频谱--直接序列扩频
  13. LINGO语法及软件操作
  14. 百度云大文件高速下载方法、软件
  15. python井字格游戏_python实现简单井字棋游戏
  16. 如何利用jqGrid表格方法重新设置caption属性值
  17. ThreadLocal不好用?那是你没用对!
  18. 数据中台产品经理-读书笔记3
  19. 以 VS Code为例,看大型开源项目是如何应用软件工程的?
  20. UG导出CAD图纸的方法

热门文章

  1. ntpdate 时间同步
  2. https 带端口_基于scapy模块的8种端口扫描
  3. ajax如何传两个不同的参数,ajax 如何从后台传多个data对象(多个参数)string类型的...
  4. python语言程序设计 陈东_清华大学出版社-图书详情-《Python语言程序设计》
  5. Centos7.x 安装JDK、Jenkins、Jmeter、ant
  6. fastJson、Jackson对象转json串不使用驼峰方法和json转对象
  7. 尚硅谷JVM笔记(宋红康主讲)
  8. Docker容器中bash: ip: command not found
  9. iOS:懒加载符号绑定流程
  10. [JavaScript语法学习]重新认识JavaScript