【1.66】 json 模块 用于字符串 和 python数据类型间进行转换(字符串)
什么叫序列化——将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。
为什么要序列化????
比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?
现在我们能想到的方法就是存在文件里,然后另一个python程序再从文件里读出来。
但是我们都知道,对于文件来说是没有字典这个概念的,所以我们只能将数据转换成字典放到文件中。
你一定会问,将字典转换成一个字符串很简单,就是str(dic)就可以办到了,为什么我们还要学习序列化模块呢?
没错序列化的过程就是从dic 变成str(dic)的过程。现在你可以通过str(dic),将一个名为dic的字典转换成一个字符串,
但是你要怎么把一个字符串转换成字典呢?
聪明的你肯定想到了eval(),如果我们将一个字符串类型的字典str_dic传给eval,就会得到一个返回的字典类型了。
eval()函数十分强大,但是eval是做什么的?e官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。
BUT!强大的函数有代价。安全性是其最大的缺点。
想象一下,如果我们从文件中读出的不是一个数据结构,而是一句"删除文件"类似的破坏性语句,那么后果实在不堪设设想。
而使用eval就要担这个风险。
所以,我们并不推荐用eval方法来进行反序列化操作(将str转换成python中的数据结构)
序列化的目的
1、以某种存储形式使自定义对象持久化;
2、将对象从一个地方传递到另一个地方。
3、使程序更具维护性。

Python可序列化的数据类型
| Python | JSON |
| dict | object |
| list, tuple | array |
| str | string |
| int, float | number |
| True | true |
| False | false |
| None | null |
Python可序列化的数据类型
| dict | object |
| list, tuple | array |
| str | string |
| int, float | number |
| True | true |
| False | false |
| None | null |
Python可序列化的数据类型
#json import json #json 就是不同语言的桥梁 传递数据 #向文本里面传递一个字典 #存储字典的一个文本 test.txt dic_name={"name":"yaoming","age":"18"} with open("test.txt","w+",encoding="utf-8") as f: f.write(str(dic_name)) #文本中内容 {'name': 'yaoming', 'age': '18'} print(f.tell()) f.seek(0) data = f.read() print(data) #{'name': 'yaoming', 'age': '18'} dic_name={"name":"yaoming","age":"18"} data_json=json.dumps(dic_name) with open("test.txt","w+",encoding="utf-8") as f: f.write(data_json) f.seek(0) data_read = f.read() print(data_read) #{"name": "yaoming", "age": "18"} #这里json.dumps 是 将字典中变成json字符串 #现将 字典中不是双引号的字符串 变成双引号 然后在把字典变成json字符串 #整型 字符串 列表 通过 json.dumps 变成 json 字符串(就还是双引号的字符串) #eval 可以取出整型 字符串 列表 字典 #json 可以转化整型 字符串 列表 字典 函数 但是不能转化类 能在任何语言之间使用 #pickle 可以转化任何类型数据 但是只能在python之间使用 #用json 存储字典 json 取出来就是字典 dic_name = {"name": "yaoming", "age": "18"} data_chang_json = json.dumps(dic_name) with open("test.txt", "w+", encoding="utf-8") as f: f.write(data_chang_json) f.seek(0) data_read = f.read() print(data_read,type(data_read)) # {"name": "yaoming", "age": "18"} <class 'str'> f.seek(0) data_json_read = json.loads(f.read()) print(data_json_read,type(data_json_read)) #{'name': 'yaoming', 'age': '18'} <class 'dict'>
浙公网安备 33010602011771号