最早接触到这个是当初要调用百度的轨迹纠偏api,请求参数里有一项是如下图所示的字符串
当时的我什么都不懂,第一想法就是先构造dict再一个个放入list中,最后str(list)即可
一顿操作猛如虎,发现api报错,请求参数错误,拿这个范例对着我的格式,发现问题在于范例里的字符串里的dict的key是双引号,而我的是单引号,不是说字符串里单引号双引号一样吗?一脸懵逼,开始想办法如何把单引号换成双引号,构造dict的时候写成双引号也是不行的,最后我自以为很机智的对最后的str进行替换,算是满足了请求参数的要求
dict_list = dict_list.replace('\'', '\"')
现在回头看看,我之前做的操作其实就是序列化
序列化指将数据结构或者对象转化为字符串,也即把数据结构或者对象由内存中转储到硬盘中
反序列化自然就是指将序列化中得到的字符串读取到内存中,恢复成原来的数据结构或者对象
在Python3中主要是通过json库中的dump(s)和load(s)实现
一、序列化:可序列化对象------->>str
1.利用dumps()实现
import json
list=['this','is','a test']
dict={'mary':83,'machael':99,'jane':66}
list_str=json.dumps(list)
dict_str=json.dumps(dict)
print(list_str)
print(type(list_str))
print(dict_str)
print(type(dict_str))
2.利用dump()实现
import json
list=['this','is','a test']
dict={'mary':83,'machael':99,'jane':66}
json.dump(list,open('list','w+'))
json.dump(dict,open('dict','w+'))
即dump()是把序列化结构对象转换成字符串后直接写入了文件
二、反序列化:str------->>可序列化对象
1.利用loads()实现
import json
list_str='["this","is","a test"]'
dict_str='{"mary":83,"machael":99,"jane":66}'
list=json.loads(list_str)
dict=json.loads(dict_str)
print(list)
print(type(list))
print(dict)
print(type(dict))
字符串中的外部必须为单引号,内部的为双引号,否则json库会解析出错:
2.利用load()实现
import json
list=["this","is","a test"]
dict={"mary":83,"machael":99,"jane":66}
json.dump(list,open('list','w+'))
json.dump(dict,open('dict','w+'))
list1=json.load(open('list','r+'))
dict1=json.load(open('dict','r+'))
print(list1,'-----',type(list1))
print(dict1,'-----',type(dict1))
即load()是将文件中的字符反序列化为原数据结构或者对象
三、总结:
dumps()和load()都是在内存中直接转化数据结构和字符串,dumps直接序列结构到字符串,loads直接字符串到原序列数据
dump()和load()会读写硬盘中的文件,dump将转化后的字符串写入文件,load读取文件中的字符串转化成原序列数据
参考链接:
https://www.cnblogs.com/bainianminguo/p/6676067.html
https://zhuanlan.zhihu.com/p/41668928