json模块

发布时间 2023-12-17 08:35:33作者: ssrheart

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)序列化的目的

  • 以某种存储形式使自定义对象持久化
  • 将对象从一个地方传递到另一个地方。
  • 使程序更具维护性。

image

【二】序列化模块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'>