序列化:是指把内存里的数据类型转化为字符串。为什么要转成字符串,因为要想传到硬盘里或者通过网络传输,只能接受字符串或者bytes(其实字符串的本质就是bytes)
反序列化,从硬盘中把字符加载回来,转化成它对应的数据类型
dumps()
dump()
import json
data = {
'roles': [
{'role': 'master', 'type': 'pip', 'life': 50},
{'role': 'hero', 'type': '关羽', 'life': 80},
]
}
# d = json.dumps(data) # 把数据变成字符串
# print(d)
# d = json.dump(data) # 把数据变成字符串并且存到文件中
f = open('saa.json', 'w')
json.dump(data, f)
# 后缀约定俗成用json,是为了表示他已经是序列化了的文件,记得打开文件,因为他传的不是文件名,而是文件的对象
# 把数据变成字符串并且存到文件中
# 拿变量d存了一下,就是说dump ,load 没写到文件,而是在内存里
load()
loads()
import json
data = {
'roles': [
{'role': 'master', 'type': 'pip', 'life': 50},
{'role': 'hero', 'type': '关羽', 'life': 80},
]
}
d = json.dumps(data) # 把数据变成字符串
d2 = json.loads(d) # 只把字符串转成相应的数据类型
print(d2['roles'])
{"roles":
[{"role": "master", "type": "pip", "life": 50},
{"role": "hero", "type": "\u5173\u7fbd", "life": 80}]} # 打印结果
import json
f = open('saa.json', 'r')
data = json.load(f)
print(data)
print(data['roles'])
{'roles': [{'role': 'master', 'type': 'pip', 'life': 50}, {'role': 'hero', 'type': '关羽', 'life': 80}]}
[{'role': 'master', 'type': 'pip', 'life': 50}, {'role': 'hero', 'type': '关羽', 'life': 80}] # 打印结果
像前面说到的,dumps() , load()没有存到硬盘里,而只是把数据类型存到内存里,有什么意义吗?(之所以这样问,是因为,内存里本来就是有这个数据,只不过是字典等等,那为什么转成字符串再存到内存里,
内存里的数据也不能操作,只能操作原数据,所以为什么用这个语法)
其实有两种作用:
1. 把自己的内存数据 通过网络 共享给远程其他人 (补充:要想通过网络发一个数据,必须以bytes的格式)
学了网络编程后,可以发远程,发给别人,相当于把自己的数据共享给远程:
比如我正在打游戏,现在有事儿,要去忙,但不想关了存到硬盘,想让别人帮忙打,就可以直接把当时的状态直接copy给别人,如果对方也有这个游戏,直接加载这个游戏的状态就可以,
然后他的内存就可以从这个状态直接往后运行
2. 定义了不同语言的之间的交互规则
即跨平台,跨语言共享我的数据
解释:比如字典这个数据类型不是python独有的 ,Java ,c , 中也有,只是不叫字典,叫数组等等,但是表现形似差不多。举例:假如京东是用Java写的,但是京东的一个商家只会用python,
这个商家是用python写的,现在京东提供给商家一个接口(接口就是商家通过调用,连一下京东,),然后按照京东指定的方式,给京东发一个指令,京东返回一个数据给商家,这个数据可以是一个大列表,
里面有很多字典组成,其中有商品进价,客户访问量等各种信息。 那么这个过程,首先要通过网络传输,所以要用到bytes,即必须序列化成字符串。 同时,京东是以Java把数据变成的字符串,并且列表,
字典是Java里边的数据类型。但是商家要通过python接收到数据并且转成python里的数据类型。
所以问题就是怎么能做到Java里边导出来的数据 python里能直接用?可以定义一个共同的规则,让Java,python甚至所有语言都能读的数据,这样所有的语言就都能进行交互,那么这个规则就是json规则,
其实json规则有两种:
也就是说两个人之间传数据的方式有三种:
一是通过纯文本文件的方式(纯文本的方式就是把数据变成一行一行,一列一列的,然后对方解析出来,其实所有语言都能解析出来纯文本的方式),缺点是不能处理,共享复杂的数据类型,比如嵌套的字典
二是xml模块,实现两种语言的交互,缺点是占内存
三是json,简单,可读性好(能直接看出他的规则),所以不同语言之间都用jaon,因为所有语言都支持字典
补充:python3中能dump好几次,但只能load一次,就是说就是一次性的取出来,如果有一个字典,一个列表,dump进去文件以后,取得时候python会把他看成一个整体,所以识别不了,就会报错。所以不要dump多次,更不能load多次