序列化
在python运行的过程中 程序存在电脑内存中 包括所有的变量
我们可以随时可以修改变量 但是程序只要一旦运行结束 变量下次初始化自动变为原来的数值1
2
3#dict类型声明方式
d = dict(name='bob',age=21,score=100)
d = {'Adam': 95,'Lisa': 85,'Bart': 59}
序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上pickling
反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化,即unpickling
Python提供了pickle模块来实现序列化
1 | import pickle |
pick.dumps() 函数是将任意对象序列化转变成一个bytes,
pickle.dump()直接把对象序列化后写入一个file-like Object
序列化后可以将其写入文件 或者进行网络传输
pickle.loads() 如果读到一个bytes字节 将其反序列化
pickle.load() 如果读到file-like Object 将其反序列化
JSON
python 内置的JSON模块提供了完善的python对象转换JSON格式的转换
JSON 对应Python 中数据类型
{ } –> dict
[ ] –> list
“string” –> str
1234.45 –> int或float
true.false –> True/False
null –> None
JSON模块1
2
3import json
d = dict(name='Bob', age=20, score=88)
json.dumps(d) #输出 '{"age": 20, "score": 88, "name": "Bob"}'
dumps()方法返回一个str,内容就是标准的JSON。
dump()方法可以直接把JSON写入一个file-like Object。
JSON反序列号
loads()将json反序列化字符串变为dict
load()从file-like Object中读取并且反序列化
1 | json_str = '{"age": 20, "score": 88, "name": "Bob"}' |
json 进阶
python中dict 对象可以直接序列化转化为JSON { } 不过python 中使用class表示对象1
2
3
4
5
6
7
8
9
10import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
s = Student('Bob', 20, 88)
print(json.dumps(s))
运行代码 得到一个 TypeError
可选参数default就是把任意一个对象变成一个可序列为JSON的对象,我们只需要为Student专门写一个转换函数,再把函数传进去即可:1
2
3
4
5
6
7def student2dict(std):
return {
'name': std.name,
'age': std.age,
'score': std.score
}
print(json.dumps(s, default=student2dict)) # 输出{"age": 20, "name": "Bob", "score": 88}
因为通常class的实例都有一个dict属性,它就是一个dict,用来存储实例变量。
print(json.dumps(s, default=lambda obj: obj.dict))
小结
python语言序列化模块式pickle,但是要序列化成标准的web要求需要使用模块JSON
json模块的dumps()和loads()函数是定义得非常好的接口的典范