ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:59.65KB ,
资源ID:11647990      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11647990.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Python处理JSON.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Python处理JSON.docx

1、Python处理JSON概念序列化(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)print JSON:,data_string输出:DATA: a:A,c:3.0,b:(2,4) #python的dict类型

3、的数据是没有顺序存储的JSON: a:A,c:3.0,b:2,4 JSON的输出结果与DATA很相似,除了一些微妙的变化,如python的元组类型变成了Json的数组,Python到Json的编码转换规则是:json.loads方法处理简单数据类型的decoding(解码)转换import jsondata = a:A,b:(2,4),c:3.0 #list对象data_string = json.dumps(data)print ENCODED:,data_stringdecoded = json.loads(data_string)print DECODED:,decodedprint O

4、RIGINAL:,type(data0b)print DECODED:,type(decoded0b)输出:ENCODED: a: A, c: 3.0, b: 2, 4DECODED: ua: uA, uc: 3.0, ub: 2, 4ORIGINAL: DECODED: 解码过程中,json的数组最终转换成了python的list,而不是最初的tuple类型,Json到Python的解码规则是:json的人文关怀编码后的json格式字符串紧凑的输出,而且也没有顺序,因此dumps方法提供了一些可选的参数,让输出的格式提高可读性,如sort_keys是告诉编码器按照字典排序(a到z)输出。im

5、port jsondata = 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, c: 3.0, b: (2, 4)JSON: a: A, c: 3.0, b: 2, 4SORT: a: A, b: 2, 4, c: 3.0indent参数根据数据格式缩进显示,读起来更加清晰:import jsondata = a:A, b:(

6、2, 4), c:3.0 print 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: 3.0INDENT: a: A, b: 2, 4 , c: 3.0 separators参数的作用是去掉,:后面的空格,从上面的输出结果都能看到, :后面都有个空格,这都是为了美化输出结果的作用,但是在我

7、们传输数据的过程中,越精简越好,冗余的东西全部去掉,因此就可以加上separators参数:import jsondata = a:A, b:(2, 4), c:3.0 print DATA:, 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, sep

8、arators=(,:)输出:DATA: a: 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, b:(2, 4), c:3.0, (d,):D tuple try: pr

9、int json.dumps(data)except (TypeError, ValueError) as err: print ERROR:, errprint print json.dumps(data, skipkeys=True)输出:ERROR: keys must be a stringa: A, c: 3.0, b: 2, 4让json支持自定义数据类型以上例子都是基于python的built-in类型的,对于自定义类型的数据结构,json模块默认是没法处理的,会抛出异常:TypeError xx is not JSON serializable,此时你需要自定义一个转换函数:i

10、mport json class MyObj(object): def _init_(self, s): self.s = s def _repr_(self): return % self.sobj = .MyObj(helloworld)try: print json.dumps(obj)except TypeError, err: print ERROR:, err#转换函数def convert_to_builtin_type(obj): print default(, repr(obj), ) # 把MyObj对象转换成dict类型的对象 d = _class_:obj._class

11、_._name_, _module_:obj._module_, d.update(obj._dict_) return dprint json.dumps(obj, default=convert_to_builtin_type)输出:ERROR: is not JSON serializabledefault( )s: hellworld, _module_: MyObj, _class_: _main_ #注意:这里的class和module根据你代码的所在文件位置不同而不同相反,如果要把json decode 成python对象,同样也需要自定转换函数,传递给json.loads方法的

12、object_hook参数:#jsontest.pyimport jsonclass MyObj(object): def _init_(self,s): self.s = s def _repr_(self): return % self.sdef dict_to_object(d): if _class_ in d: class_name = d.pop(_class_) module_name = d.pop(_module_) module = _import_(module_name) print MODULE:,module class_ = getattr(module,clas

13、s_name) print CLASS,class_ args = dict(key.encode(ascii),value) for key,value in d.items() print INSTANCE ARGS:,args inst = class_(*args) else: inst = d return instencoded_object = s:helloworld,_module_:jsontest,_class_:MyObjmyobj_instance = json.loads(encoded_object,object_hook=dict_to_object)print

14、 myobj_instance输出:MODULE: CLASS INSTANCE ARGS: s: uhelloworldMODULE: CLASS INSTANCE ARGS: s: uhelloworld使用Encoder与Decoder类实现json编码的转换JSONEncoder有一个迭代接口iterencode(data),返回一系列编码的数据,他的好处是可以方便的把逐个数据写到文件或网络流中,而不需要一次性就把数据读入内存.import jsonencoder = json.JSONEncoder()data = a:A, b:(2, 4), c:3.0 for part in e

15、ncoder.iterencode(data): print PART:, part输出:PART: PART: PART: aPART: :PART: APART: ,PART: cPART: :PART: 3.0PART: ,PART: bPART: :PART: 2PART: , 4PART: PART: PART: encode方法等价于.join(encoder.iterencode(),而且预先会做些错误检查(比如非字符串作为dict的key),对于自定义的对象,我们只需从些JSONEncoder的default()方法,其实现方式与上面提及的函数convet_to_builtin

16、_type()是类似的。import jsonimport json_myobjclass MyObj(object): def _init_(self,s): self.s = s def _repr_(self): return % self.sclass MyEncoder(json.JSONEncoder): def default(self, obj): print default(, repr(obj), ) # Convert objects to a dictionary of their representation d = _class_:obj._class_._name

17、_, _module_:obj._module_, d.update(obj._dict_) return dobj = json_myobj.MyObj(helloworld)print objprint MyEncoder().encode(obj)输出:default( )s: helloworld, _module_: Myobj, _class_: MyObj从json对Python对象的转换:class MyDecoder(json.JSONDecoder): def _init_(self): json.JSONDecoder._init_(self, object_hook=s

18、elf.dict_to_object) def dict_to_object(self, d): if _class_ in d: class_name = d.pop(_class_) module_name = d.pop(_module_) module = _import_(module_name) print MODULE:, module class_ = getattr(module, class_name) print CLASS:, class_ args = dict( (key.encode(ascii), value) for key, value in d.items

19、() print INSTANCE ARGS:, args inst = class_(*args) else: inst = d return instencoded_object = s: helloworld, _module_: jsontest, _class_: MyObjmyobj_instance = MyDecoder().decode(encoded_object)print myobj_instance输出:MODULE: CLASS: INSTANCE ARGS: s: uhelloworldjson格式字符串写入到文件流中上面的例子都是在内存中操作的,如果对于大数据,

20、把他编码到一个类文件(file-like)中更合适,load()和dump()方法就可以实现这样的功能。import jsonimport tempfiledata = a:A, b:(2, 4), c:3.0 f = tempfile.NamedTemporaryFile(mode=w+)json.dump(data, f)f.flush()print open(f.name, r).read()输出:a: A, c: 3.0, b: 2, 4类似的:import jsonimport tempfilef = tempfile.NamedTemporaryFile(mode=w+)f.write(a: A, c: 3.0, b: 2, 4)f.flush()f.seek(0)print json.load(f)输出:ua: uA, uc: 3.0, ub: 2, 4

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1