🍖json 模块

引入

1.eval( ) 函数

  • 内置函数 这一张中咱们介绍过了 eval( ) 函数, 他能够将字符串转成Python对象
  • 不过局限性比较大, 只能运用于普通的数据类型, 遇到特殊的数据类型就无论用 了
  • eval( ) 的处理重点 : 执行一个字符串表达式, 并返回表达式的值

2.eval 函数存取数据示例

🍔经过文件将字典转成字符串存入(序列化)
dic = {'name':'egon','age':18}
with open('db.txt','w',encoding='utf-8')as f :
    f.write(str(dic))
    
🍔经过"eval"函数将拿出来的字符串转成数据结构(反序列化)
with open('db.txt','r',encoding='utf-8')as f:
    data = f.read()
    dic = eval(data)
    print(dic)        # {'name': 'egon', 'age': 18}
    print(type(dic))  # <class 'dict'>

3.eval 的局限性

x="[null,true,false,1]"
print(eval(x))  # 报错,没法解析null类型

一.什么是序列化和反序列化

1.序列化

  • 把某个语言的变量转成 json 格式字符串html

  • 内存中的数据结构----->转成一种中间格式(字符串)----->存到文件中前端

2.反序列化

  • json 格式字符串转成某个语言的变量java

  • 文件----->读取中间格式(字符串)----->eval( ) 转成内存中数据结构python

3.json 的标准格式字符串

  • {"name" : "shawn", "age" : 18, "local" : true, "xx" : null}
  • json格式字符串符号必须是双引号

二.为何要序列化

序列化两种用途:编程

1.持久保持状态

  • 一个软件或程序的运行就是在处理一系列状态的变化, 编程语言中, "状态"会以各类各样有结构的数据类型(或变量)保存在内存中
  • 而内存是没法永久保存数据的, 当断电或者是重启程序, 内存中那些有结构的数据都会被清空
  • 那么序列化就是在你机器在断电或重启以前将当前内存中的数据都保存到文件中去,下次执行程序能够直接载入以前的数据, 而后继续执行 (就至关于单机游戏存档)
存取数据 (格式标准), 一个程序写入, 另外一个程序读取 (这两个程序能够是使用不一样的语言写的)

2.跨平台数据交互

  • 序列化以后, 不只能够将序列化后的内容存入磁盘, 也能够经过网络传输到别的机器上
  • 若是发送和接收方都约定好使用同一种序列化的格式, 那么便屏蔽了平台和语言所带来的的差别性, 实现了跨平台数据交互
  • 反过来, 把数据(变量)内容从序列化的对象从新读到内存中, 这就称之为反序列化
例如 : 后端给前端的数据就是 "json" 格式字符串

三. json 能序列化的类型

  • json 模块能够序列化:字典,列表,布尔json

  • json 数据类型和 python 数据类型对应关系表后端

Json类型 Python类型
{} dict
[] list
"string" str
1.73 int或float
true/false True/False
null None
  • 序列化三种类型示例 (简单使用方法)
dic = {'movieIds': [111, 222, 333, 444],\
	'stids': [{'movieId': 11, 'stid': 1}, \
				{'movieId': 22, 'stid': 2}, \
					{'movieId': 33, 'stid': 3}]}
res = json.dumps(dic)
print(res)  
'''能够发现对应格式已经发生了转变
{"movieIds": [111, 222, 333, 444],\
"stids": [{"movieId": 11, "stid": 1},{"movieId": 22, "stid": 2}, {"movieId": 33, "stid": 3}]}
'''

四.json 序列化的使用

1.简单用法

import json

dic = {"name":"song"}
print(json.dumps(dic))  # {"name": "song"}

s = '{"name": "song"}'
print(json.loads(s))  # {'name': 'song'}

2.写入文件序列化与反序列化 (复杂)

  • 序列化 : .dumps()
import json

dic = {'name':'song','age':21}
dic = json.dumps(dic)
print(dic,type(dic))  # {"name": "song", "age": 21} <class 'str'>
with open('db.json','a',encoding='utf-8')as f:
    f.write(dic)
  • 反序列化 : .loads()
with open('db.json', 'rt', encoding='utf-8')as f:
    data = f.read()
    dic = json.loads(data)
    print(dic, type(dic))  # {'name': 'song', 'age': 21} <class 'dict'>

3.简单序列化与反序列化 (提供直接写入文件功能)

  • 序列化 : .dump()
  • 直接以字符串写进文件
import json
dic = {'name':'song','age':21}
with open('db1.json','wt',encoding='utf-8')as f:
    json.dump(dic,f)
  • 反序列化 : .load()
  • 直接拿出来转成你的数据类型
with open('db1.json','rt',encoding='utf-8')as f:
    dic = json.load(f)
    print(dic,dic['age'])  # {'name': 'song', 'age': 21} 21

五.中文序列化问题

  • 演示
import json

dic = {"name": "派大星", "age": 22}
res = json.dumps(dic)
print(res)  # {"name": "\u6d3e\u5927\u661f", "age": 22}
  • 加入 ensure_ascii=False 功能
dic = {"name": "派大星", "age": 22}
res = json.dumps(dic,ensure_ascii=False)
print(res)  # {"name": "派大星", "age": 22}
  • 问题总结
并无使用上的变化, 存的是什么, 取出来的仍是什么, 只不过人家内部帮你转成"uncode"格式保存

ps : java中,出于性能的考虑,有不少包来完成序列化和反序列化:谷歌的gson 阿里开源fastjson 等等网络

六.pickle 模块

pickle序列化与反序列化👈点我

相关文章
相关标签/搜索