在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式

字符串解码为python数据对象。在python的标准库中,专门提供了json库与pickle库来处理这部分。

先来学习json的库,导入json库很简单,直接import json,下面通过具体的实例来说明json库对序列化与反序列化的使用。json库的主要方法为:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import json
  5.  
  6. print json.__all__

见json库的主要方法:

  1. ['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']

我们定义一个字典,通过json把它序列化为json格式的字符串,见实现的代码:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import json
  5.  
  6. dict1={'name':'wuya','age':22,'address':'xian'}
  7.  
  8. print u'未序列化前的数据类型为:',type(dict1)
  9. print u'未序列化前的数据:',dict1
  10. #对dict1进行序列化的处理
  11. str1=json.dumps(dict1)
  12. print u'序列化后的数据类型为:',type(str1)
  13. print u'序列化后的数据为:',str1

见如上的代码输出的内容:

1
2
3
4
5
6
7
C:\Python27\python.exe D:/git/Python/doc/index.py
未序列化前的数据类型为: <type 'dict'>
未序列化前的数据: {'age'22'name''wuya''address''xian'}
序列化后的数据类型为: <type 'str'>
序列化后的数据为: {"age"22"name""wuya""address""xian"}
 
Process finished with exit code 0

通过如上的代码以及结果可以看到,这就是一个序列化的过程,简单的说就是把python的数据类型转换为json格式的

字符串。下来我们再反序列化,把json格式的字符串解码为python的数据对象,见实现的代码和输出:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import json
  5.  
  6. dict1={'name':'wuya','age':22,'address':'xian'}
  7.  
  8. print u'未序列化前的数据类型为:',type(dict1)
  9. print u'未序列化前的数据:',dict1
  10. #对dict1进行序列化的处理
  11. str1=json.dumps(dict1)
  12. print u'序列化后的数据类型为:',type(str1)
  13. print u'序列化后的数据为:',str1
  14. #对str1进行反序列化
  15. dict2=json.loads(str1)
  16. print u'反序列化后的数据类型:',type(dict2)
  17. print u'反序列化后的数据:',dict2

见输出结果的内容:

  1. C:\Python27\python.exe D:/git/Python/doc/index.py
  2. 未序列化前的数据类型为: <type 'dict'>
  3. 未序列化前的数据: {'age': 22, 'name': 'wuya', 'address': 'xian'}
  4. 序列化后的数据类型为: <type 'str'>
  5. 序列化后的数据为: {"age": 22, "name": "wuya", "address": "xian"}
  6. 反序列化后的数据类型: <type 'dict'>
  7. 反序列化后的数据: {u'age': 22, u'name': u'wuya', u'address': u'xian'}

下面我们结合requests库,来看返回的json数据,具体代码为:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import json
  5. import requests
  6.  
  7. r=requests.get('http://wthrcdn.etouch.cn/weather_mini?city=西安')
  8.  
  9. print r.text,u'数据类型:',type(r.text)
  10. #对数据进行反序列化的操作
  11. dic=json.loads(r.text)
  12. print dic,u'数据类型:',type(dic)

见输出的内容:

  1. C:\Python27\python.exe D:/git/Python/doc/index.py
  2. {"desc":"OK","status":1000,"data":{"wendu":"3","ganmao":"昼夜温差较大,较易发生感冒,请适当增减衣服。体质较弱的朋友请注意防护。","forecast":[{"fengxiang":"东北风","fengli":"微风级","high":"高温 10℃","type":"晴","low":"低温 -2℃","date":"22日星期四"},{"fengxiang":"东北风","fengli":"微风级","high":"高温 8℃","type":"多云","low":"低温 0℃","date":"23日星期五"},{"fengxiang":"东北风","fengli":"微风级","high":"高温 7℃","type":"阴","low":"低温 0℃","date":"24日星期六"},{"fengxiang":"东北风","fengli":"微风级","high":"高温 1℃","type":"雨夹雪","low":"低温 -1℃","date":"25日星期天"},{"fengxiang":"东北风","fengli":"微风级","high":"高温 5℃","type":"多云","low":"低温 1℃","date":"26日星期一"}],"yesterday":{"fl":"微风","fx":"北风","high":"高温 7℃","type":"阴","low":"低温 -1℃","date":"21日星期三"},"aqi":"87","city":"西安"}} 数据类型: <type 'unicode'>
  3. {u'status': 1000, u'data': {u'city': u'\u897f\u5b89', u'yesterday': {u'fx': u'\u5317\u98ce', u'type': u'\u9634', u'high': u'\u9ad8\u6e29 7\u2103', u'low': u'\u4f4e\u6e29 -1\u2103', u'date': u'21\u65e5\u661f\u671f\u4e09', u'fl': u'\u5fae\u98ce'}, u'forecast': [{u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 10\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'22\u65e5\u661f\u671f\u56db', u'type': u'\u6674', u'low': u'\u4f4e\u6e29 -2\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 8\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'23\u65e5\u661f\u671f\u4e94', u'type': u'\u591a\u4e91', u'low': u'\u4f4e\u6e29 0\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 7\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'24\u65e5\u661f\u671f\u516d', u'type': u'\u9634', u'low': u'\u4f4e\u6e29 0\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 1\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'25\u65e5\u661f\u671f\u5929', u'type': u'\u96e8\u5939\u96ea', u'low': u'\u4f4e\u6e29 -1\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 5\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'26\u65e5\u661f\u671f\u4e00', u'type': u'\u591a\u4e91', u'low': u'\u4f4e\u6e29 1\u2103'}], u'ganmao': u'\u663c\u591c\u6e29\u5dee\u8f83\u5927\uff0c\u8f83\u6613\u53d1\u751f\u611f\u5192\uff0c\u8bf7\u9002\u5f53\u589e\u51cf\u8863\u670d\u3002\u4f53\u8d28\u8f83\u5f31\u7684\u670b\u53cb\u8bf7\u6ce8\u610f\u9632\u62a4\u3002', u'wendu': u'3', u'aqi': u'87'}, u'desc': u'OK'} 数据类型: <type 'dict'>
  4.  
  5. Process finished with exit code 0

事实上,在如上的代码中,我们可以不通过反序列化的操作,代码可以简化为:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import json
  5. import requests
  6.  
  7. r=requests.get('http://wthrcdn.etouch.cn/weather_mini?city=西安')
  8. print r.json(),u'数据类型为:',type(r.json())

见输出的内容:

  1. C:\Python27\python.exe D:/git/Python/doc/index.py
  2. {u'status': 1000, u'data': {u'city': u'\u897f\u5b89', u'yesterday': {u'fx': u'\u5317\u98ce', u'type': u'\u9634', u'high': u'\u9ad8\u6e29 7\u2103', u'low': u'\u4f4e\u6e29 -1\u2103', u'date': u'21\u65e5\u661f\u671f\u4e09', u'fl': u'\u5fae\u98ce'}, u'forecast': [{u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 10\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'22\u65e5\u661f\u671f\u56db', u'type': u'\u6674', u'low': u'\u4f4e\u6e29 -2\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 8\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'23\u65e5\u661f\u671f\u4e94', u'type': u'\u591a\u4e91', u'low': u'\u4f4e\u6e29 0\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 7\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'24\u65e5\u661f\u671f\u516d', u'type': u'\u9634', u'low': u'\u4f4e\u6e29 0\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 1\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'25\u65e5\u661f\u671f\u5929', u'type': u'\u96e8\u5939\u96ea', u'low': u'\u4f4e\u6e29 -1\u2103'}, {u'fengxiang': u'\u4e1c\u5317\u98ce', u'high': u'\u9ad8\u6e29 5\u2103', u'fengli': u'\u5fae\u98ce\u7ea7', u'date': u'26\u65e5\u661f\u671f\u4e00', u'type': u'\u591a\u4e91', u'low': u'\u4f4e\u6e29 1\u2103'}], u'ganmao': u'\u663c\u591c\u6e29\u5dee\u8f83\u5927\uff0c\u8f83\u6613\u53d1\u751f\u611f\u5192\uff0c\u8bf7\u9002\u5f53\u589e\u51cf\u8863\u670d\u3002\u4f53\u8d28\u8f83\u5f31\u7684\u670b\u53cb\u8bf7\u6ce8\u610f\u9632\u62a4\u3002', u'wendu': u'3', u'aqi': u'87'}, u'desc': u'OK'} 数据类型为: <type 'dict'>
  3.  
  4. Process finished with exit code 0

在实际的工作中,序列化或者反序列化的可能是一个文件的形式,不可能像如上写的那样简单的,下来就来实现这部分,把文件内容

进行序列化和反序列化,先来看序列化的代码:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import json
  5.  
  6. list1=['selenium','appium','android','ios','uiautomator']
  7. #把list1先序列化,再写入到一个文件中
  8. print json.dump(list1,open('c:/log.log','w'))
  9. print u'文件内容为:'
  10. r=open('c:/log.log','r+')
  11. print r.read()

见输出的内容:

  1. C:\Python27\python.exe D:/git/Python/doc/index.py
  2. None
  3. 文件内容为:
  4. ["selenium", "appium", "android", "ios", "uiautomator"]
  5.  
  6. Process finished with exit code 0

下面我们来反序列化,也就是先读取文件里面的内容,再进行反序列化,见实现的代码:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import json
  5.  
  6. list1=['selenium','appium','android','ios','uiautomator']
  7. #把list1先序列化,再写入到一个文件中
  8. print json.dump(list1,open('c:/log.log','w'))
  9. print u'文件内容为:'
  10. r=open('c:/log.log','r+')
  11. print r.read()
  12. #先读取文件内容,再进行反序列化
  13. res=json.load(open('c:/log.log','r+'))
  14. print res,u'数据类型:',type(res)

见输出的内容:

  1. C:\Python27\python.exe D:/git/Python/doc/index.py
  2. None
  3. 文件内容为:
  4. ["selenium", "appium", "android", "ios", "uiautomator"]
  5. [u'selenium', u'appium', u'android', u'ios', u'uiautomator'] 数据类型: <type 'list'>
  6.  
  7. Process finished with exit code 0

下来来看pickle库,它提供的方法为:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import pickle
  5.  
  6. print pickle.__all__
  1. C:\Python27\python.exe D:/git/Python/doc/index.py
  2. ['PickleError', 'PicklingError', 'UnpicklingError', 'Pickler', 'Unpickler', 'dump', 'dumps', 'load', 'loads', 'APPEND', 'APPENDS', 'BINFLOAT', 'BINGET', 'BININT', 'BININT1', 'BININT2', 'BINPERSID', 'BINPUT', 'BINSTRING', 'BINUNICODE', 'BUILD', 'DICT', 'DUP', 'EMPTY_DICT', 'EMPTY_LIST', 'EMPTY_TUPLE', 'EXT1', 'EXT2', 'EXT4', 'FALSE', 'FLOAT', 'GET', 'GLOBAL', 'HIGHEST_PROTOCOL', 'INST', 'INT', 'LIST', 'LONG', 'LONG1', 'LONG4', 'LONG_BINGET', 'LONG_BINPUT', 'MARK', 'NEWFALSE', 'NEWOBJ', 'NEWTRUE', 'NONE', 'OBJ', 'PERSID', 'POP', 'POP_MARK', 'PROTO', 'PUT', 'REDUCE', 'SETITEM', 'SETITEMS', 'SHORT_BINSTRING', 'STOP', 'STRING', 'TRUE', 'TUPLE', 'TUPLE1', 'TUPLE2', 'TUPLE3', 'UNICODE']
  3.  
  4. Process finished with exit code 0

这里我们只关注pickle库的dump(),dumps(),load(),loads()方法,先来看序列化的代码:

  1. import pickle
  2.  
  3. dic={'name':'无涯','age':22,'address':'西安'}
  4. str1=pickle.dumps(dic)
  5. print str1,type(str1)

见输出的内容:

  1. C:\Python27\python.exe D:/git/Python/doc/index.py
  2. (dp0
  3. S'age'
  4. p1
  5. I22
  6. sS'name'
  7. p2
  8. S'\xe6\x97\xa0\xe6\xb6\xaf'
  9. p3
  10. sS'address'
  11. p4
  12. S'\xe8\xa5\xbf\xe5\xae\x89'
  13. p5
  14. s. <type 'str'>

输出的内容基本看不懂,但是可以看到数据格式是字符串,这是ASCII格式的数据,默认是ASCII格式保存对象,

在进行序列化的使用,设置为True就是二进制保存对象,见实现的代码和输出内容:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import pickle
  5.  
  6. dic={'name':'无涯','age':22,'address':'西安'}
  7. str1=pickle.dumps(dic,True)
  8. print str1,type(str1)

见输出的二进制的数据:

  1. C:\Python27\python.exe D:/git/Python/doc/index.py
  2. }q (UageqKUnameqU无涯qUaddressqU西安qu. <type 'str'>

下面通过loads()方法来进行反序列化,见实现的代码:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import pickle
  5.  
  6. dic={'name':u'无涯','age':22,'address':u'西安'}
  7. #序列化
  8. str1=pickle.dumps(dic,True)
  9. print str1,type(str1)
  10. #反序列化
  11. dict1=pickle.loads(str1)
  12. print dict1,type(dict1)

见输出的内容:

  1. C:\Python27\python.exe D:/git/Python/doc/index.py
  2. }q (UageqKUnameqX 无涯qUaddressqX 西安qu. <type 'str'>
  3. {'age': 22, 'name': u'\u65e0\u6daf', 'address': u'\u897f\u5b89'} <type 'dict'>

下来我们通过对文件的形式来进行序列化和反序列化,见实现的代码:

  1. #!/usr/bin/env python
  2. #coding:utf-8
  3.  
  4. import pickle
  5.  
  6. dic={'name':u'无涯','age':22,'address':u'西安'}
  7. #先序列化,然后写入到文件中
  8. pickle.dump(dic,open('c:/log.log','w'),True)
  9. print u'文件内容为:'
  10. print open('c:/log.log').read()
  11. #先读取文件,再反序列化
  12. d=pickle.load(open('c:/log.log','r+'))
  13. print u'反序列化后的数据与数据类型:',d,type(d)

见输出的内容:

  1. C:\Python27\python.exe D:/git/Python/doc/index.py
  2. 文件内容为:
  3. }q (UageqKUnameqX 无涯qUaddressqX 西安qu.
  4. 反序列化后的数据与数据类型: {'age': 22, 'name': u'\u65e0\u6daf', 'address': u'\u897f\u5b89'} <type 'dict'>
  5.  
  6. Process finished with exit code 0

python接口测试之序列化与反序列化(四)的更多相关文章

  1. python类库32[序列化和反序列化之pickle]

      一 pickle pickle模块用来实现python对象的序列化和反序列化.通常地pickle将python对象序列化为二进制流或文件.   python对象与文件之间的序列化和反序列化: pi ...

  2. C#实现接口xml序列化与反序列化

    C#实现接口xml序列化与反序列化   C#中接口无法被xml序列化,提示不支持.百度和bing也搜不到,只好自己动手写了 原理上肯定支持,.Net自己的xml序列化有一个IXmlSerializab ...

  3. python接口测试之mock(二)

    上一篇对mock-server已经做了初步的介绍,今天这里继续接着之前的介绍进行,我们先看之前的mock-server部分,之前编写了一个登录的mock,具体json文件见如下的内容: 小王子1110 ...

  4. Python库:序列化和反序列化模块pickle介绍

    1 前言 在“通过简单示例来理解什么是机器学习”这篇文章里提到了pickle库的使用,本文来做进一步的阐述. 通过简单示例来理解什么是机器学习 pickle是python语言的一个标准模块,安装pyt ...

  5. python中的序列化和反序列化

    ~~~~~~滴滴,,什么是序列呢?可以理解为序列就是字符串.序列化的应用 写文件(数据传输) 网络传输 序列化和反序列化的概念   序列化模块:将原本的字典.列表等内容转换成一个字符串的过程就叫做序列 ...

  6. Python开发之序列化与反序列化:pickle、json模块使用详解

    1 引言 在日常开发中,所有的对象都是存储在内存当中,尤其是像python这样的坚持一切接对象的高级程序设计语言,一旦关机,在写在内存中的数据都将不复存在.另一方面,存储在内存够中的对象由于编程语言. ...

  7. 模块讲解----pickle模块(只在python用的序列化与反序列化)

    特点 1.只能在python中使用,只支持python的基本数据类型. 2.可以处理复杂的序列化语法.(例如自定义的类的方法,游戏的存档等) 3.序列化的时候,只是序列化了整个序列对象,而不是内存地址 ...

  8. python marshal 对象序列化和反序列化

    有时候,要把内存中的一个对象持久化保存到磁盘上,或者序列化成二进制流通过网络发送到远程主机上.Python中有很多模块提供了序列化与反序列化的功能,如:marshal, pickle, cPickle ...

  9. Python实现JSON序列化和反序列化

    在我的应用中,序列化就是把类转成符合JSON格式的字符串,反序列化就是把JSON格式的字符串转换成类.C#的话直接用Newtonsoft.JSON就可以了,非常好用.本来以为python也会有类似的库 ...

随机推荐

  1. [POI2010]Antisymmetry

    Description 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作"反对称"字符串.比如00001111和010101就是反对称的,100 ...

  2. sqlserver事务隔离

    事务是一个工作单元,可能包含查询和修改数据以及修改数据定义等多个活动.我们可以显式或隐式的定义事务边界.可以使用BEGIN TRAN或者BEGIN TRANSACTION语句显式的定义事务的开始.如果 ...

  3. domain admin域管理员

    当计算机加入到域后,默认将"Domain Admins"组赋予了本地系统管理员的权限.也就是说,在计算机添加到域,成为域的成员主机的过程中,系统将会自动把"Domain ...

  4. 437 Path Sum III 路径总和 III

    给定一个二叉树,二叉树的每个节点含有一个整数.找出路径和等于给定数的路径总数.路径不需要从根节点开始,也不需要在叶节点结束,当路径方向必须是向下的(只从父节点到子节点).二叉树不超过1000个节点,节 ...

  5. [转]mysql事务处理用法与实例详解

    转自:http://www.cnblogs.com/ymy124/p/3718439.html MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关1.MyISAM:不支持事务,用于 ...

  6. outlook 通讯录分类--2017年1月16日--对联系人分类管理

    outlook功能多,复杂,导致打开界面就晕,通讯录分类 问:在Outlook 中,随着联系人数量的增多,亲朋好友.同事.客户的信息混杂在一起,每次发邮件都要用很长时间才能从联系人列表中找到需要的人. ...

  7. ADO.net增删改的使用

    添加数据 -------------------------------------------------- //让用户输入要添加的内容 Console.WriteLine("请输入要添加 ...

  8. thinkphp3.2 + soap

    服务器配置 扩展libxml2下载地址:http://xmlsoft.org/downloads.html 在windows下的php.ini文件里 找到这一行代码(如没有则自行添加) extensi ...

  9. 关于java的arrays数组排序示例AJPFX的分享

    Java API对Arrays类的说明是:此类包含用来操作数组(比如排序和搜索)的各种方法. 1.对基本数据类型的数组的排序 说明: (1)Arrays类中的sort()使用的是“经过调优的快速排序法 ...

  10. 冒泡排序算法和简单选择排序算法的js实现

    之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(d ...