版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、概念序列化(Serialization ):将对象的状态信息转换为可以存储或可以通过网络传输的过程,传输的格式可以是 JSON、XML等。反序列化就是从存储区域(JSON , XML)读取反序列 化对象的状态,重新创建该对象。JSON (JavaScript Object Notation ): 一种轻量级数据交换格式,相对于 XML而言更 简单,也易于阅读和编写,机器也方便解析和生成,Json是JavaScript中的一个子集。Python2.6开始加入了 JSON模块,无需另外下载,Python的Json模块序列化与反序列化的过程分别是 encoding 和decodingencoding
2、 :把一个 Python对象编码转换成 Json字符串decoding :把Json格式字符串解码转换成Python对象对于简单数据类型(string、Unicode、int、float、list、tuple、dict),可以直接处理。json.dumps方法对简单数据类型encoding :import jsondata = 'a':"A",'b':(2,4),'c':3.0 #list对象print "DATA:",repr(data)data_string = json.dumps(data)prin
3、t "JSON:",data_string输出:DATA: 'a':'A','c':3.0,'b':(2,4) #python的 dict 类型的数据是没有顺序存储的JSON: "a":"A","c":3.0,"b":2,4JSON的输出结果与DATA很相似,除了一些微妙的变化,如python的元组类型变成了 Json 的数组,Python到Json的编码转换规则是:PythonJSONdictobjectlist, tuplear
4、raysirt unicodestringinij Longj floatnumberTruetrueFalsefalseNonenulljson.loads方法处理简单数据类型的decoding(解码)转换对象import json data = 'a':"A",'b':(2,4),'c':3.0 #listdata_string = json.dumps(data) print "ENCODED:",data_stringdecoded = json.loads(data_string) print &
5、quot;DECODED:",decodedprint "ORIGINAL:",type(data0'b') print "DECODED:",type(decoded0'b')输出:ENCODED: "a": "A", "c": 3.0, "b": 2, 4DECODED: u'a': u'A', u'c': 3.0, u'b': 2, 4ORIGINAL: <t
6、ype 'tuple'> DECODED: <type 'list'> 解码过程中,json的数组最终转换成了python的list,而不是最初的tuple类型,Json到Python的解码规则是:JSONPylhonobjectdietarraylistsiringUnicodenurrLer(int)int langnurrfeftr(real)floittrueTruefalscFalsenullNonejson的人文关怀编码后的json格式字符串紧凑的输出,而且也没有顺序,因此 dumps方法提供了一些可选 的参数,让输出的格式提高可读
7、性,如 sort_keys是告诉编码器按照字典排序(a到z)输出。import json data = 'a':'A', 'b':(2, 4), 'c':3.0 print 'DATA:', repr(data) unsorted = json.dumps(data) print 'JSON:', json.dumps(data) print 'SORT:', json.dumps(data, sort_keys=True)输出:DATA: 'a': 'A
8、39;, 'c': 3.0, 'b': (2, 4)JSON: "a": "A", "c": 3.0, "b": 2, 4SORT: "a": "A", "b": 2, 4, "c": 3.0 indent参数根据数据格式缩进显示,读起来更加清晰:import jsondata = 'a':'A', 'b':(2, 4), 'c':3.0 p
9、rint 'DATA:', repr(data)print 'NORMAL:', json.dumps(data, sort_keys=True)print 'INDENT:', json.dumps(data, sort_keys=True, indent=2)输出:DATA: 'a': 'A', 'c': 3.0, 'b': (2, 4)NORMAL: "a": "A", "b": 2, 4, "c"
10、: 3.0INDENT: "a": "A", "b": 2, 4 , "c": 3.0 separators参数的作用是去掉,:后面的空格,从上面的输出结果都能看到",:”后面都有个空格,这都是为了美化输出结果的作用,但是在我们传输数据的过程中,越精简越好,冗余的东西全部去掉,因此就可以加上separators参数:import jsondata = 'a':'A', 'b':(2, 4), 'c':3.0 print 'DATA:&
11、#39;, repr(data)print 'repr(data):', len(repr(data)print 'dumps(data) :', len(json.dumps(data) print 'dumps(data, indent=2) :', len(json.dumps(data, indent=2) print 'dumps(data, separators):', len(json.dumps(data, separators=(',',':')输出:DATA: 'a
12、9;: 'A', 'c': 3.0, 'b': (2, 4)repr(data) : 35dumps(data) : 35dumps(data, indent=2) : 76dumps(data, separators): 29skipkeys参数,在encoding过程中,dict对象的key只可以是string对象,如果是其他类 型,那么在编码过程中就会抛出ValueError的异常。skipkeys 可以跳过那些非 string对象当作key的处理.import jsondata= 'a':'A', '
13、;b':(2, 4), 'c':3.0, ('d',):'D tuple' try:print json.dumps(data)except (TypeError, ValueError) as err:print 'ERROR:', errprintprint json.dumps(data, skipkeys=True)输出:ERROR: keys must be a string"a": "A", "c": 3.0, "b": 2, 4让
14、json支持自定义数据类型以上例子都是基于python的built-in类型的,对于自定义类型的数据结构,json模块默认是没法处理的,会抛出异常: TypeError xx is not JSON serializable,此时你需要自定义一个转换函数:import jsonclass MyObj(object):def _init_(self, s):self.s = sdef _repr_(self):return '<MyObj(%s)>' % self.s obj = .MyObj('helloworld')try:print json.d
15、umps(obj)except TypeError, err:print 'ERROR:', err#转换函数def convert_to_builtin_type(obj):print 'default。,repr(obj),')'# 把MyObj对象转换成dict类型的对象d = '_class_':obj._class_._name_,'_module_':obj._module_,d.update(obj._dict_) return dprint json.dumps(obj, default=convert_t
16、o_builtin_type)输出:ERROR: <MyObj(helloworld)> is not JSON serializabledefault( <MyObj(helloworld)>)"s": "hellworld", " _module_": "MyObj", " _class_": "_main_"#注意:这里的class和module根据你代码的所在文件位置不同而不同相反,如果要把json decode 成python对象,同样也需要
17、自定转换函数,传递给json.10ads方法的object_hook 参数:#jsontest.pyimport jsonclass MyObj(object):def _init_(self,s):self.s = sdef _repr_(self):return "<MyObj(%s)>" % self.sdef dict_to_object(d):if ' _class_' in d:class_name = d.pop('_class_')module_name = d.pop('_module_')mod
18、ule = _import_(module_name)print "MODULE:",moduleclass_ = getattr(module,class_name)print "CLASS",class_args = dict(key.encode('ascii'),value) for key,value in d.items()print 'INSTANCE ARGS:',argsinst = class_(*args)else:inst = dreturn instencoded_object = '&q
19、uot;s":"helloworld","_module_":"jsontest","_class_":"MyObj"'myobj_instance = json.loads(encoded_object,object_hook=dict_to_object)print myobj_instance输出:MODULE: <module 'jsontest' from 'E:Usersliuzhijunworkspacepythonjsontest.
20、py'>CLASS <class 'jsontest.MyObj'>INSTANCE ARGS: 's': u'helloworld' <MyObj(helloworld)>MODULE: <module 'jsontest' from 'E:Usersliuzhijunworkspacepythonjsontest.py'>CLASS <class 'jsontest.MyObj'>INSTANCE ARGS: 's':
21、 u'helloworld'<MyObj(helloworld)>使用Encoder与Decoder类实现json编码的转换JSONEncoder有一个迭代接口iterencode(data) ,返回一系列编码的数据,他的好处是可以方便的把逐个数据写到文件或网络流中,而不需要一次性就把数据读入内存import jsonencoder = json.JSONEncoder()data = 'a':'A', 'b':(2, 4), 'c'30 for part in encoder.iterencode(d
22、ata):print 'PART:', part输出:PART:PART: PART: "a"PART:PART: "A"PART:,PART: "c"PART:PART: 3.0PART:,PART: "b"PART:PART: 2PART: , 4PART:PART: PART:encode方法等价于''.join(encoder.iterencode(),而且预先会做些错误检查(比如非字符串作为dict的key),对于自定义的对象, 我们只需从些 JSONEncoder的def
23、ault() 方法, 其实现方式与上面提及的函数convet_to_builtin_type()是类似的。import jsonimport json_myobj class MyObj(object):def _init_(self,s):self.s = sdef _repr_(self):return "<MyObj(%s)>" % self.sclass MyEncoder(json.JSONEncoder):def default(self, obj):print 'default。,repr(obj),')'# Convert
24、 objects to a dictionary of their representationd = '_class_':obj._class_._name_,'_module_':obj._module_,d.update(obj._dict_)return dobj = json_myobj.MyObj('helloworld')print objprint MyEncoder().encode(obj)输出:<MyObj(internal data)>default( <MyObj(internal data)>
25、)"s": "helloworld", "_module_": "Myobj", "_class_": "MyObj”从json对Python对象的转换:class MyDecoder(json.JSONDecoder):def _init_(self):json.JSONDecoder._init_(self, object_hook=self.dict_to_object)def dict_to_object(self, d):if ' _class_' in d:
26、class_name = d.pop('_class_')module_name = d.pop('_module_')module = _import_(module_name)print 'MODULE:', moduleclass_ = getattr(module, class_name)print 'CLASS:', class_args = dict( (key.encode('ascii'), value) for key, value in d.items()print 'INSTANCE ARGS:', argsinst = class_(*args)else:inst = dreturn instencoded_object = '"s": "helloworld", " _module_": "jsontest", " _class_":"MyObj"'myobj_instance = MyDecoder().decode(encoded
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 雅安市2024年四川雅安市考试招聘综合类事业单位工作人员(239人)笔试历年参考题库典型考点附带答案详解(3卷合一)试卷2套
- 遂宁市四川遂宁市就业服务管理局面向社会招聘1名编外人员笔试历年参考题库典型考点附带答案详解(3卷合一)试卷2套
- 荆门市2024年湖北荆门市事业单位“招硕引博”1213人笔试历年参考题库典型考点附带答案详解(3卷合一)试卷2套
- 玉溪市2024云南玉溪市直事业单位选调28人笔试历年参考题库典型考点附带答案详解(3卷合一)试卷2套
- 山西省2024山西社会主义学院招聘2人笔试历年参考题库典型考点附带答案详解(3卷合一)试卷2套
- 宁波市2024浙大宁波理工学院招聘事业编制辅导员4人笔试历年参考题库典型考点附带答案详解(3卷合一)试卷2套
- 国家事业单位招聘2024中国(教育部)留学服务中心招聘笔试历年参考题库典型考点附带答案详解(3卷合一)试卷2套
- 博兴县2024山东滨州市博兴经济开发区产业公司平台公司招聘20人笔试历年参考题库典型考点附带答案详解(3卷合一)试卷2套
- 2025广东依顿电子科技股份有限公司招聘汽车电子产品线产品工程师拟录用人员笔试历年备考题库附带答案详解
- 阿瓦提县2025年度面向社会公开招聘警务辅助人员备考题库及答案详解(考点梳理)
- 2026年农业科技领域人才选拔与专业技能考核要点解析
- 茶叶对外贸易科普
- 2025年度科室护士长工作总结与2026年工作计划
- TCEC5023-2020电力建设工程起重施工技术规范报批稿1
- 农产品营销策略研究国内外文献综述
- 儿科急诊与急救护理
- 信任价格关系研究-洞察与解读
- DLT 1051-2019电力技术监督导则
- DL∕ T 845.3-2004 电阻测量装置通 用技术条件 第3部分直流电阻测试仪
- 高水平专业群建设报告
- 防洪排涝工程实施性施工组织设计
评论
0/150
提交评论