这是我参与8月更文挑战的第9天,活动详情查看: 8月更文挑战
回顾复习
我们都知道Python内置库提供了支持序列化和反序列化的模块如下:
- 对数据以JSON格式进行序列和反序列化-json模块
- 使用二进制协议来对数据序列和反序列化-pickle模块
- 对数据进行键值对形式处理-shelve模块
✨我们在pickle模块中知道了序列化和反序列化的基本概念
- 序列化:将数据以某种协议转成通用格式
- 反序列化:将数据转换成可阅读的格式
🤔哪为什么要进行序列化?
表面上:方便数据在网络中通信
深层上:
我们都是设备之间传输数据通常是TCP/IP协议,我们来看一下发送端和接收端过程
-
发送端
(1)TCP/IP协议只支持字节数组的传输,不能直接传对象
(2)对象序列化的结果一定是字节数组!当两个进程在进行远程通信时,彼此可以发送各种类型的数据。
(3)所以何种类型的数据,都会以二进制序列的形式在网络上传送。
-
接收端
(1)发送方需要把这个对象转换为字节序列,才能在网络上传送;
(2)接收方则需要把字节序列再恢复为对象。
本次,我们继续学习Python对数据序列和反序列化常用使用的模块-json模块
下雨天☔️,带上耳机🎧、播放音乐🎼,开始今天的学习之旅💃💃💃~
1. JSON格式基本知识
首先我们来看一下,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。
JSON格式的特点:
- 易于人类阅读和编写的格式
- 易于机器解析和生成
- 采用完全独立于语言的文本格式
- 对象是无序的,格式采用key-value键值对+
{}
形式 - 对象与对象之间用逗号隔开,对象与值之间用冒号隔开
- "{}"用来表达对象,"[]"用来表达数组
- JSON数据中可以嵌套数组[]等格式
如下是来官网介绍JSON格式示例图:
🤪看完JSON格式的特点,我们心中顿时充满疑惑:
JSON格式与字典不是长得一样吗,为啥还会有JSON这玩意?
在python中,字典和JSON非常类似,原因是都是以key-vlaue的形式展示的
- JSON:是一种数据格式,是纯字符串,可以被解析成python的dict或者其他形式
- dict: 是一种完整的数据结构,采用hash table来实现的,使用hash函数来进行存储key-value的位置
因此,通过仔细的对比,发现字典dict和JSON它们还是有差异的,如下表格显示差异点:
JSON | dict |
---|---|
Key只能是字符串 | key可以是hash对象(数字、字符串、元组) |
key可以是有序、重复的 | key是不可以重复 |
key存在默认undefined | key默认没有默认值 |
value只能是字符串、浮点数、布尔值或者null,或者构成的数组或者对象 | value值可以是任何类型的值 |
访问方式是 [],也可以是 .,遍历方式分为for..in | value仅可以下标访问 |
字符串强制双引号 | 字符串可以单引号、双引号 |
可以嵌套只有数组 | 可以嵌套tuple |
布尔类型表示:true、false、null | 布尔类型表示:True、False、None |
中文字符串编码是unicode | 中文字符串编码是utf-8 |
2. json模块支持的数据格式转换
Python json模块支持Python数据对象和JSON类型互相转换
- 支持对数字、字符串、列表、字典和元组数据类型
- 通用的序列化格式
- 只有很少的一部分数据类型能够通过json转化成字符串
Python数据类型转换成JSON格式
Python数据类型 | JSON |
---|---|
dict | Object |
list, tuple | array |
str | string |
int, float, int- & float-derived Enums | numbers |
True | true |
False | false |
None | null |
JSON格式转换成Python数据类型
JSON | Python数据类型 |
---|---|
object | dict |
array | list |
string | str |
number(int) | int |
number(real) | float |
true | True |
false | False |
null | None |
📣重要说明:
- Python dict中非字符串的key转化成JSON字符串时都会被转换成小写字符串
- Python中tuple,在序列化时会转换成array,但反序列化时,array会被转化为list
- 对Python内置的数据类型,json模块可以直接进行序列化和反序列化处理。
- 对于自定义的对象进行序列化和反序列化时,需要我们自己定义一个方法来完成object和dict之间进行转换
3. json模块相关方法
json模块提供了对JSON的支持,既包含对JSON字符串恢复成Python数据类型对象的函数,也提供将Python数据类型对象转换成JSON字符串的函数,常用方法如下:
方法 | 作用 |
---|---|
json.dump(obj,fp) | 将对象转化成JSON格式,存入指定文件中 |
json.dumps(obj) | 将对象转化成JSON格式的字符串 |
json.load(fp) | 从指定文件中json字符串反序列化 |
json.loads(s) | 将JSON字符串对象反序列化 |
PS:json模块的方法与pickle方法相似,只是对数据进行序列化的格式不一样
import json
dict_school={
'School':'Juejin school',
'class count':2,
'class info':
{
'one class':
{
'class name':'Rose class',
'teacher name':'Anne',
'student sum':30
},
'two class':
{
'class name':'Moon class',
'teacher name':'Toney',
'student sum':23
}
},
'special':["dance","swimming"],
'class_teacher':("XiaoMING","ROSEXIAO"),
'isclassing':True,
'isleave': None
}
Js = json.dumps(dict_school)
#对文件进行序列化
with open(r"f:\school_juejin.json","w") as fp:
ret_dic = json.dump(dict_school,fp)
# 对文件进行反序列化
with open(r"f:\school_juejin.json","r") as fp:
ret_dic = json.load(fp)
print("类型:",type(ret_dic))
print("ret_dic内容:",ret_dic)
print("查字段:",ret_dic['class info']['one class'].values())
总结
本期,我们学习了Python对数据进行序列化和反序列化使用最多的模块的json模块
json模块同样也提供了dumps()、dump()函数进行对数据序列化为json格式,load()、loads()函数对json格式对象反序列化操作。
以上是本期内容,欢迎大佬们点赞评论ღ( ´・ᴗ・` )比心,下次见~💖💗💓