序列化
什么是序列化
得到一个序列的结果(字符串)
字典/列表/数字/对象 ---序列化 ->字符串
为什么要序列化
- 要把内容写入文件需要使用序列化
- 网络传输数据时候需要用到序列化
什么是反序列化
字符串 -> 反序列化 -> 字典/列表/数字/对象
序列化方法
json
import json
序列化
序列化字典
dic = {"aaa": 'bbb', 'ccc':'ddd'}
print(dic, type(dic))
输出结果
{'aaa': 'bbb', 'ccc': 'ddd'} <class 'dict'>
说明: 可以观察到, 虽然字典的key aaa是用双引号, 但是输出的时候显示的是单引号;
python的数据字符串输出都是用单引号, 只有json格式的数据才是双引号
str_dic = json.dumps(dic)
print(str_dic, type(str_dic))
输出结果
{"aaa": "bbb", "ccc": "ddd"} <class 'str'>
说明: 可以观察到, 这是个字符串, 而且里面的字符串都是用双引号引起来的, 表示已经由json序列化成功
写数据到文件
方法1
with open('json_dump', 'w') as f:
f.write(str_dic)
方法2
with open('json_dump2', 'w') as f:
json.dump(dic, f)
反序列化
反序列化由字典序列化成的json字符串
ret = json.loads(str_dic)
print(ret, type(ret))
输出结果
{'aaa': 'bbb', 'ccc': 'ddd'} <class 'dict'>
读取文件
with open('json_dump2') as f:
res = json.load(f)
print(res, type(res))
输出结果
{'aaa': 'bbb', 'ccc': 'ddd'} <class 'dict'>
json高级
限制1
json格式的key必须是字符串数据类型, 如果是数字为key, 那么dumps之后会强行转换成字符串数据类型
dic = {1: 2, 3: 4}
print(dic, type(dic))
输出结果
{1: 2, 3: 4} <class 'dict'>
序列化
str_dic = json.dumps(dic)
print(str_dic, type(str_dic))
输出结果
{"1": 2, "3": 4} <class 'str'>
反序列化
new_dic = json.loads(str_dic)
print(new_dic, type(new_dic))
输出结果
{'1': 2, '3': 4} <class 'dict'>
限制2
json对元组做value的字典会把元组强制转换成列表
dic = {'abc': (1, 2, 3)}
print(dic, type(dic))
输出结果
{'abc': (1, 2, 3)} <class 'dict'>
序列化
str_dic = json.dumps(dic)
print(str_dic, type(str_dic))
输出结果
{"abc": [1, 2, 3]} <class 'str'>
反序列化
new_dic = json.loads(str_dic)
print(new_dic, type(new_dic))
print(new_dic['abc'], type(new_dic['abc']))
输出结果
{'abc': [1, 2, 3]} <class 'dict'>
[1, 2, 3] <class 'list'>
限制3
json不支持元组做key
dic = {(1, 2, 3): 'abc'}
str_dic = json.dumps(dic)
输出结果
TypeError: keys must be a string
限制4
json中的字符串只能是双引号