python接口测试之序列化与反序列化(四)

在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式字符串解码为python数据对象。在python的标准库中,专门提供了json库与pickle库来处理这部分。

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

#!/usr/bin/env python#coding:utf-8
import  json
print json.__all__

见json库的主要方法:

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

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

#!/usr/bin/env python#coding:utf-8
import  json

dict1={'name':'wuya','age':22,'address':'xian'}
print u'未序列化前的数据类型为:',type(dict1)
print u'未序列化前的数据:',dict
#对dict1进行序列化的处理str1=json.dumps(dict1)
print u'序列化后的数据类型为:',type(str1)
print u'序列化后的数据为:',str1 

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

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的数据对象,见实现的代码和输出:

#!/usr/bin/env python#coding:utf-8
import  json
  
dict1={'name':'wuya','age':22,'address':'xian'}
print u'未序列化前的数据类型为:',type(dict1)
print u'未序列化前的数据:',dict1
#对dict1进行序列化的处理
str1=json.dumps(dict1)
print u'序列化后的数据类型为:',type(str1)
print u'序列化后的数据为:',str1
#对str1进行反序列化
dict2=json.loads(str1)
print u'反序列化后的数据类型:',type(dict2)
print u'反序列化后的数据:',dict2

见输出结果的内容:

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"}
反序列化后的数据类型: <type 'dict'>反序列化后的数据: {u'age': 22, u'name': u'wuya', u'address': u'xian'}

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

#!/usr/bin/env python#coding:utf-8
import  json
import  requests

r=requests.get('http://wthrcdn.etouch.cn/weather_mini?city=西安')
print r.text,u'数据类型:',type(r.text)
#对数据进行反序列化的操作
dic=json.loads(r.text)
print dic,u'数据类型:',type(dic)

见输出的内容:

C:\Python27\python.exe D:/git/Python/doc/index.py
{"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'>{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'>Process finished with exit code 0

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

#!/usr/bin/env python#coding:utf-8
import  json
import  requests

r=requests.get('http://wthrcdn.etouch.cn/weather_mini?city=西安')
print r.json(),u'数据类型为:',type(r.json())

见输出的内容:

C:\Python27\python.exe D:/git/Python/doc/index.py
{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'>Process finished with exit code 0

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

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

见输出的内容:

C:\Python27\python.exe D:/git/Python/doc/index.py
None
文件内容为:
["selenium", "appium", "android", "ios", "uiautomator"]

Process finished with exit code 0

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

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

见输出的内容:

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

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

#!/usr/bin/env python#coding:utf-8
import  pickle
  
print pickle.__all__
C:\Python27\python.exe D:/git/Python/doc/index.py
['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']

Process finished with exit code 0

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

import  pickle

dic={'name':'无涯','age':22,'address':'西安'}
str1=pickle.dumps(dic)
print str1,type(str1)

见输出的内容:

C:\Python27\python.exe D:/git/Python/doc/index.py
(dp0
S'age'p1
I22
sS'name'p2
S'\xe6\x97\xa0\xe6\xb6\xaf'p3
sS'address'p4
S'\xe8\xa5\xbf\xe5\xae\x89'p5
s. <type 'str'>

输出的内容基本看不懂,但是可以看到数据格式是字符串,这是ASCII格式的数据,默认是ASCII格式保存对象,在进行序列化的使用,设置为True就是二进制保存对象,见实现的代码和输出内容:

#!/usr/bin/env python#coding:utf-8
import  pickle

dic={'name':'无涯','age':22,'address':'西安'}
str1=pickle.dumps(dic,True)
print str1,type(str1)

见输出的二进制的数据:

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

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

#!/usr/bin/env python#coding:utf-8
import  pickle

dic={'name':u'无涯','age':22,'address':u'西安'}
#序列化
str1=pickle.dumps(dic,True)
print str1,type(str1)
#反序列化
dict1=pickle.loads(str1)
print dict1,type(dict1)

见输出的内容:

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

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

#!/usr/bin/env python#coding:utf-8
import  pickle

dic={'name':u'无涯','age':22,'address':u'西安'}
#先序列化,然后写入到文件中pickle.dump(dic,open('c:/log.log','w'),True)
print u'文件内容为:'
print open('c:/log.log').read()
#先读取文件,再反序列化
d=pickle.load(open('c:/log.log','r+'))
print u'反序列化后的数据与数据类型:',d,type(d)

见输出的内容:

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

原文发布于微信公众号 - Python自动化测试(wuya-python)

原文发表时间:2016-12-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏风口上的猪的文章

.NET面试题系列[10] - IEnumerable的派生类

IEnumerable分为两个版本:泛型的和非泛型的。IEnumerable只有一个方法GetEnumerator。如果你只需要数据而不打算修改它,不打算为集合...

1042
来自专栏hbbliyong

一个小程序引发的思考

   既然是一个小程序引发的思考,那么我们就先看看这个小程序,看看他有何神奇之处: namespace ConsoleApplication1 { cl...

2414
来自专栏ACM算法日常

UVA10305 | 拓扑排序

John has n tasks to do. Unfortunately, the tasks are not independent and the exe...

772
来自专栏程序你好

C# 发展历史及版本新功能介绍

832
来自专栏程序员互动联盟

【专业技术】hash_map使用(二)

上次说完了简单类型的hash_map使用,现在说说用户自定义类型:比如对象类型,结构体的hash_map使用。 这种情况比价复杂,我们先...

28011
来自专栏数据结构与算法

3339: Rmq Problem

Description image.png Input image.png Output image.png Sample Input 7 5 ...

33611
来自专栏向治洪

Swift 4.0 新特性

WWDC 2017 带来了很多惊喜,在这次大会上,Swift 4 也伴随着 Xcode 9 测试版来到了我们的面前,虽然正式版要8月底9月初才会公布,但很多强大...

2259
来自专栏Jimoer

在Java的反射中,Class.forName和ClassLoader的区别

最近在面试过程中有被问到,在Java反射中Class.forName()加载类和使用ClassLoader加载类的区别。当时没有想出来后来自己研究了一下就写下来...

1352
来自专栏增长技术

采用现代Objective-C

多年来,Objective-C语言已经有了革命性的发展。虽然核心理念和实践保持不变, 但语言中的部分内容经历了重大的变化和改进。现代化的Objective-C在...

783
来自专栏好好学java的技术栈

一文看透java8新特性

毫无疑问,Java 8发行版是自Java 5(发行于2004,已经过了相当一段时间了)以来最具革命性的版本。Java 8 为Java语言、编译器、类库、开发工具...

1132

扫码关注云+社区