序列化和反序列化

json序列化

序列化:把python的基本数据类型转化为字符串,通过json.dumps来实现

1 import json
2 dic={'k1':'v1'}
3 print(dic,type(dic)) 
4 result=json.dumps(dic)  #把字典转化为字符串
5 print(result,type(result))
1 输出:
2 {'k1': 'v1'} <class 'dict'>
3 {"k1": "v1"} <class 'str'>

反序列化:把python的字符串转化为python的基本数据类型,通过json.loads来实现。反序列化时要使用双引号

1 import json
2 s1='{"k1":123}'    #类似于一个字典的字符串,注意k1要使用双引号
3 print(s1,type(s1))
4 s2=json.loads(s1)  #反序列化为一个真正的字典
5 print(s2,type(s2))
6 输出
7 {"k1":123} <class 'str'>
8 {'k1': 123} <class 'dict'>

 序列化的应用:当我们发送一个http请求给某网站时时,会返回给我们一个字符串。为了取值方便,我们通常把字符串转化为Python某个数据类型。json可以跨语言

1 通过json来获取天气指数
2 import requests  #用于发送http请求
3 import json
4 response = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=北京') #通过requests发起一个请求,得到一个返回值给response
5 print(type(response.text))  #response.text是一个类似于数据字典的字符串,记录着北京的天气
6 response.encoding='utf-8'
7 dic=json.loads(response.text) #把response.text反序列化为一个字典,方便我们取值
8 print(type(dic))

 json.dump和json.load?  ,相对于json.dumps和json.loads多了一些操作。

json.dump多了一步写操作

1 import json
2 s1=[1,2,3]
3 json.dump(s1,open("db1",'w'))  #做了两步操作,首先把列表s1转化为字符串(如果没有这一步的话列表是不能直接写入文件中的) ,然后写入文件db1中

json.load多了一步读操作

1 import json
2 s2=json.load(open("db1","r"))#同样做了两步操作,首先读出文件db1中的字符串,然后将其转化为python某一数据类型
3 print(s2,type(s2))

 另外一种序列化pickle,只适用于python语言

1 import pickle
2 li=[1,2,3]
3 r=pickle.dumps(li)  #转化为python特有的字节
4 print(r,type(r))
5 输出
6 b'\x80\x03]q\x00(K\x01K\x02K\x03e.' <class 'bytes'>
s=pickle.loads(r)   #反序列化
print(s,type(s))
输出:
[1, 2, 3] <class 'list'>

 

 pickle.dump,pickle.load类似于json.dump,json.load

 

 总结:json和pickle的区别?

json可以支持多种语言,但是只支持在python中str,list,tuple,dict,int,True,False,float等数据类型

pickle只支持python,但是支持更多的数据类型,复杂的数据类型。

 

注意:python不同版本之间的序列化可能会出现问题

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2016-10-18 15:13  hehe88  阅读(142)  评论(0)    收藏  举报