什么是序列化(Serialization):
序列化是将对象的状态信息转化为可以存储和传输的形式的过程。
序列化之后可以把序列化后的内容写入磁盘或者通过网络传输到其他机器
反过来,把变量内容从序列化的对象重新读到内存里的过程叫反序列化
什么是Json:
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。Json采用完全独立于语言的文本格式,但是也使用了类似C语言的家族习惯(例如C,C++,C#,Java,JavaScript,Perl,Python等),这些特性,使Json成为理想的交换语言。一般处理简单的数据对象, 主要进行各个语言间的数据交互
json.dumps(obj) # 将python 对象保存为Json格式
json.dump(obj,file) # 将python 对象直接转换为Json格式并保存在file中
json.loads(obj) #将json 格式转化为python对象
json.load(obj.file) #从file中将obj 转化为python对象
对于简单数据类型的encoding 和 decoding:
###encoding >>> import json >>> obj=[[1,2,3],('a','b','c'),{'4':5,'6':7},'def'] >>> encoding_json=json.dumps(obj) >>> print(encoding_json) [[1, 2, 3], ["a", "b", "c"], {"4": 5, "6": 7}, "def"] #注意这里元组转化为列表 >>> print(repr(obj)) [[1, 2, 3], ('a', 'b', 'c'), {'4': 5, '6': 7}, 'def'] #这里只是转化为字符串
>>> json.dumps({'b':4,'a':5,'e':6})
'{"a": 5, "b": 4, "e": 6}'
>>> json.dumps({'b':4,'a':5,'e':6},sort_keys=True)
'{"a": 5, "b": 4, "e": 6}'
>>> a = json.dumps({'b':4,'a':5,'e':6},sort_keys=True,indent=5)#indent指明缩进为5
>>> print(a)
{
"a": 5,
"b": 4,
"e": 6
}
在Json的编码过程中,会存在从Python数据类型向Json类型的转化。
Python | Json |
dict | object |
list,tuple | array |
str | string |
int,float | number |
True | true |
False | false |
None | null |
## decode >>> encoding_json '[[1, 2, 3], ["a", "b", "c"], {"4": 5, "6": 7}, "def"]' >>> decoding_json=json.loads(encoding_json) >>> print(decoding_json) [[1, 2, 3], ['a', 'b', 'c'], {'4': 5, '6': 7}, 'def'] >>> type(decoding_json) <class 'list'> >>> print(decoding_json[2]['4']) 5
从Json到Python的数据类型转化对照如下:
JSON | Python |
object | dict |
array | list |
string | unicode |
number | int,long |
ture | True |
false | False |
null | None |
Pickle 可以处理较为复杂的数据类型, 比如函数. pickle 模块对于python序列化和反序列化执行二进制协议。pickle 仅仅是python的一个
序列化对象,仅对python有用。
Comparison with Json
1. JSON is a text serialization format, while pickle is a binary serialization format;
2. JSON is human-readable, while pickle is not;
3. JSOn is interoperable and widely used outside of the Python ecosystem, while pickle is Python-specific;
Pickcle, Json 两者共同的用法 dumps/loads/dump/load
Pickcle.dump(obj,file.[protocol])
序列化对象,并将结果数据流写入到文件 对象中,参数protocol是序列化模式,默认值为0,表示以文本的形式序列化。
protocol的值还可以是1或2,表示以二进制的形式序列化。
pickle.load(file)
反序列化对象,将文件中的数据解析为一个python对象。
eg: 序列化
# encoding import pickle data = { 'a':[1,2,0,3], 'b':('string',u'unicode string'), 'c': {None,True,False} } with open('data.pickle','wb') as f: # pickcle the 'data' dictionary using the higheset protocol available. pickle.dump(data,f,pickle.HIGHEST_PROTOCOL)
反序列化:
#! /webapp/python/python3/bin/python3 import pickle with open('data.pickle','rb') as f: data = pickle.load(f) print(data) for key in data: print(key,'--->',data[key]) #结果 {'a': [1, 2, 0, 3], 'b': ('string', 'unicode string'), 'c': {False, True, None}} a ---> [1, 2, 0, 3] b ---> ('string', 'unicode string') c ---> {False, True, None}