json反序列化与pickle
一、定义
序列化:将内存中的不可持久化和传输对象转换为可方便持久化和传输对象的过程。
反序列化:将可持久化和传输对象转换为不可持久化和传输对象的过程。
二、 应用场景
跨平台数据传输;
保留上一次运行程序时对对象的修改
三、模块和函数
1. json
dumps()、dump()(序列化)
loads()、load() (反序列化)
2. pickle
dumps()、dump()(序列化)
loads()、load ()(反序列化)
dumps()与dump()的区别是dumps()只是单纯得将对象序列化,而dump()会在序列化之后将结果写入到文件当中;
与之对应,loads()与load()区别至于loads()是对dumps的序列化结果进行反序列化,而dump()会从文件中读取内容进行反序列化。
四、案例
序列化 info={"name":"kezi","age":22} f=open("test.text","w") f.write(str(info)) f.close() 反序列 info={"name":"kezi","age":22} f=open("test.text","r") data=eval(f.read()) f.close() print (data['age']) 打印结果 22 json 简单用法 import json info={"name":"kezi","age":22} f=open("test.text","w") print(json.dumps(info)) f.write(json.dumps(info)) #f.write(str(info)) f.close() 打印结果 {"age": 22, "name": "kezi"} import json f=open("test.text","r") #data=eval(f.read()) data=json.loads(f.read()) f.close() print (data['age']) 打印结果 22 序列化 pickle import pickle def si(name): print("helle",name) info={"name":"kezi","age":22,"func":si} f=open("test.text","wb") print(pickle.dumps(info)) f.write(pickle.dumps(info)) #f.write(str(info)) f.close() 打印结果 b'x80x03}qx00(Xx04x00x00x00nameqx01Xx04x00x00x00keziqx02Xx03x00x00x00ageqx03Kx16Xx04x00x00x00funcqx04c__main__ si qx05u.' 反序列化 import pickle def si(name): print("helle2",name) f=open("test.text","rb") #data=eval(f.read()) data=pickle.loads(f.read()) f.close() print (data["func"]("kezi")) 打印结果 helle2 kezi None 另一种简化写法 import pickle def si(name): print("helle",name) info={"name":"kezi","age":22,"func":si} f=open("test.text","wb") pickle.dump(info,f) #f.write(pickle.dumps(info)) f.close() import pickle def si(name): print("helle2",name) f=open("test.text","rb") #data=eval(f.read()) data=pickle.load(f)#data=pickle.loads(f.read()) f.close() print (data ["func"]("kezi"))
pickle序列化结果为bites类型,只适合于Python机器之间的交互。
json序列化结果为str类型,能够被多种语言识别,可用于与其他程序设计语言交互。
目前,JSON格式字符串已经成为网络传输中的一种标准格式,所以在web后台开发中通常用json模块来序列化而不是pickle模块。
JSON和Python内置的数据类型对应如下:
JSON类型
|
Python类型
|
{}
|
dict
|
[]
|
list
|
"string"
|
'str'或u'unicode'
|
1234.56
|
int或float
|
true/false
|
True/False
|
null
|
None
|
注:
(1)序列化与反序列化是为了解决内存中对象的持久化与传输问题;
(2)Python中提供了pickle和json两个模块进行序列化与反序列化;
(3)dumps()和dump()用于序列化,loads()和load()用于反序列化;
(4)pickle模块能序列化任何对象,序列化结果为bites类型,只适合于Python机器之间交互;
json模块只能序列化Python基本类型,序列化结果为json格式字符串,适合不同开发语言之间交互。
json的用法与pickle大致相同,但要注意在读写文件时json的读写模式是“w”和“b”,而不是“wb”和“rb”。