json模块
json模块
【一】序列化和反序列化
(1)什么是序列化
- 将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化。
(2)为什么要有序列化
-
比如,我们在python代码中计算的一个数据需要给另外一段程序使用,那我们怎么给?
- 现在我们能想到的方法就是存在文件里
- 然后另一个
python
程序再从文件里读出来。
-
但是我们都知道
- 对于文件来说是没有字典这个概念的
- 所以我们只能将数据转换成字典放到文件中。
-
你一定会问,将字典转换成一个字符串很简单,就是
str(dic) 就可以办到了
- 为什么我们还要学习序列化模块呢?
-
没错序列化的过程就是从
dic
变成str(dic)
的过程。 -
现在你可以通过
str(dic) - 将一个名为
dic
的字典转换成一个字符串,
- 将一个名为
-
但是你要怎么把一个字符串转换成字典呢?
-
聪明的你肯定想到了
eval()
,如果我们将一个字符串类型的字典str_dic
传给eval
,就会得到一个返回的字典类型了。 -
eval()函数十分强大,但是
eval 是做什么的?
- 官方demo解释为:
- 将字符串
str
当成有效的表达式来求值并返回计算结果。 BUT!
强大的函数有代价。安全性是其最大的缺点。
-
-
想象一下
- 如果我们从文件中读出的不是一个数据结构,
- 而是一句"删除文件"类似的破坏性语句
- 那么后果实在不堪设设想。 而使用
eval
就要担这个风险。
-
所以
- 我们并不推荐用
eval
方法来进行反序列化操作(将str
转换成python
中的数据结构)
- 我们并不推荐用
(3)序列化的目的
- 以某种存储形式使自定义对象持久化;
- 将对象从一个地方传递到另一个地方。
- 使程序更具维护性。
【二】序列化模块json
(1)导入模块
import json
(2)写入文件(dump)
(1)不指定参数
- 接收一个文件句柄
- 直接将
字典
转换成json字符串
写入文件
import json python_obj = {"name": "heart", "age": 12} # 将 Python 字典写入 JSON 文件 with open("data.json", "w") as f: json.dump(python_obj, f)
(2)指定参数编码(ensure_ascii)
import json python_obj = {"name": "哈特", "age": 12} # 写文件时指定编码格式为 utf-8 ---> 这样在json文件中存储的中文才是正常的中文,否则是二进制数据 # 将 Python 字典写入 JSON 文件 with open("data.json", "w", encoding='utf-8') as f: # ensure_ascii=False 上面指定编码格式后需要将 默认使用 ascii 这个选项设置为否 json.dump(python_obj, f, ensure_ascii=False)
# 未指定 {"name": "\u54c8\u7279", "age": 12} # 指定 ensure_ascii=False {"name": "哈特", "age": 12}
(3)读文件数据(load)
- 接收一个文件句柄
- 直接将文件中的
json字符串
转换成数据结构
返回
import json # 可以选择指定读取数据的默认编码格式 with open("data.json", "r", encoding='utf-8') as f: # 从 data.json 中将数据读出来并转换为Python字典 python_obj = json.load(f)
(4)序列化方法(loads)
- 将json字符串转换为Python对象
import json json_str = '{"name": "heart", "age": 12}' # 将json字符串转换为Python对象 python_obj = json.loads(json_str) print(python_obj, type(python_obj)) # {'name': 'heart', 'age': 12} <class 'dict'>
(5)反序列化(dumps)
- 将Python对象转换为json字符串
- json转换完的字符串类型的字典中的字符串是由
""
表示的
import json python_obj = {"name": "heart", "age": 12} # 将 Python 字典编码为JSON 字符串 json_str = json.dumps(python_obj) print(json_str, type(json_str)) # {"name": "heart", "age": 12} <class 'str'>
本文作者:heart
本文链接:https://www.cnblogs.com/ssrheart/p/17908739.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步