1.json、requests难点记录
1.json
1.json 和python字典
(http://www.cnblogs.com/Eva-J/articles/7228075.html#)
1.为什么要序列化?
将原本的字典、列表等内容转换成一个字符串的过程就叫做序列化, 数据的传输需要使用字符串的形式进行传输。json是一一种所有语言都能识别的数据结构,如python ,java ,js等
2.json的本质
JSON本质是str,有两种结构,就是对象和数组两种结构
Json模块:用于字符串 和 python数据类型间进行转换
json的本质是str,是符合某种格式的str,(只能用“”双引号表示)
- dumps:将字典转换为字符串 转换后的字符串用双引号表示
- dump:需结合文件使用,将字符串写入文件中
def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,allow_nan=True, cls=None, indent=None, separators=None,default=None, sort_keys=False, **kw):
def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,allow_nan=True, cls=None, indent=None, separators=None,default=None, sort_keys=False, **kw):
- loads:将字符串(字符串必须用双引号表示)转换为字典
- load:从文件中读取字符串,转化为字典
1 import json 2 dic = {'k1':'v1','k2':'v2','k3':'v3'} 3 str_dic = json.dumps(dic) #序列化:将一个字典转换成一个字符串 4 print(type(str_dic),str_dic) #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"} 5 #注意,json转换完的字符串类型的字典中的字符串是由""表示的 6 7 dic2 = json.loads(str_dic) #反序列化:将一个字符串格式的字典转换成一个字典 8 #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示 9 print(type(dic2),dic2) #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'} 10 11 12 list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}] 13 str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 14 print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}] 15 list_dic2 = json.loads(str_dic) 16 print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}] 17 18 loads和dumps
import json f = open('json_file','w') dic = {'k1':'v1','k2':'v2','k3':'v3'} json.dump(dic,f) #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件 f.close() f = open('json_file') dic2 = json.load(f) #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回 f.close() print(type(dic2),dic2) load和dump
3.json和python的转换
1.python转json
import json """python----> json""" """dict----> oject""" dic={'1':'a','2':'b'} str_dic=json.dumps(dic) print(str_dic,type(str_dic)) # {"1": "a", "2": "b"} <class 'str'> """tuple----> array""" tuple=(1,2,3,'t') str_tuple=json.dumps(tuple) print(str_tuple,type(str_tuple)) #[1, 2, 3, "t"] <class 'str'> 注意:元组是有序的,字典是无序的,这样转换后,元素的顺序有可能被改变 """list----> array""" list=[1,3,4,'3'] str_list=json.dumps(list) print(str_list,type(str_list)) #[1, 3, 4, "3"] <class 'str'> """str----> string""" str1='1,2,3' str2="1,2,3" str_str1=json.dumps(str1) print(str_str1,type(str_str1)) #"1,2,3" <class 'str'> """True/False----> true/false""" i=True k=False str_i=json.dumps(i) print(str_i,type(str_i)) #true <class 'str'> str_k=json.dumps(k) print(str_k,type(str_k)) #false <class 'str'> """None----> null""" i=None str_i=json.dumps(i) print(str_i,type(str_i)) #null <class 'str' 测试时,传递的为json格式,使用null.而不是None. 测试数据: {'params':{"id":'null',"addressDetail":"'浙江省_杭州市_西湖区'"},'headers':{'Content-Type':'application/json'}}
2.json 转python
3.json 中文的处理
1.ensure_ascii:默认值True,如果dict内含有non-ASCII(如 中文)的字符,则会类似\uXXXX的显示数据,设置成False后,就能正常显示
1 1 # -*- coding: utf-8 -*- 2 """中文""" 3 i="中文" 4 str_i=json.dumps(i) 5 print(str_i,type(str_i)) #"\u4e2d\u6587" <class 'str'> 6 7 str_ii=json.dumps(i,ensure_ascii=False) 8 print(str_ii,type(str_ii)) #"中文" <class 'str'> 9 10 python_i=json.loads(str_i) 11 print(python_i,type(python_i)) #中文 <class 'str'>
2.
python在做接口测试的时候,打印出来的json格式的中文数据显示异常,打印出来的消息显示的是:{u'status': u'failed', u'error': {u'msg': u'\u8bf7\u767b\u9646\u540e\u8fdb\u884c\u64cd\u4f5c!', u'code': u'err_needlogin'}}发现全是中文uncode显示.
解决方法:使用dumps方法的ensure_ascii=False,打印出来的消息显示为:{"status": "failed", "error": {"msg": "请登陆后进行操作!", "code": "err_needlogin"}}
通过json库里面的dumps方法可以让其显示为中文,默认是以ASCII来解析code,中文不在ASCII编码当中,所以无法正常显示。json.dumps方法讲ASCII编码设置为false即可解决此问题。
1 '''result.json 和json.dumps(result)''' 2 result.json() #->{u'status': u'failed', u'error': {u'msg': u'\u8bf7\u767b\u9646\u540e\u8fdb\u884c\u64cd\u4f5c!', u'code': u'err_needlogin'}} 3 json.dumps(result,ensure_ascii=False) #{"status": "failed", "error": {"msg": "请登陆后进行操作!", "code": "err_needlogin"}}
3.# -*- coding: utf-8 -*-
允许在Python文件中,通过文件开始处的,放在注释中的,字符串形式的,声明自己的python文件,用何种编码。
对此格式的详细解释是:
- 如果没有此文件编码类型的声明,则python默认以ASCII编码去处理
- 如果你没声明编码,但是文件中又包含非ASCII编码的字符的话,python解析器去解析的python文件,自然就会报错了。
- 必须放在python文件的第一行或第二行
4. json.dumps(参数)
1json.dumps(data, sort_keys=True):是告诉编码器按照字典排序(a到z)输出。
2.json.dumps(data, sort_keys=True, indent=2):
indent
参数根据数据格式缩进显示,读起来更加清晰:
INDENT: [
{
"a": "A",
"b": [
2,
4
],
"c": 3.0
}
]
2.requests
1.requests.get(url,params= payload) payload = {'key1': 'value1', 'key2': 'value2'}
注意:
payload = {'key1': '1'} 1为int型
payload = {'key1': '“1”'} 1为string型
2.requests.post(url,method,json,data,headers,cookies)
data
参数传入一个元组列表
json 参数传入一个字典