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文件,用何种编码。

对此格式的详细解释是:

  1. 如果没有此文件编码类型的声明,则python默认以ASCII编码去处理
    • 如果你没声明编码,但是文件中又包含非ASCII编码的字符的话,python解析器去解析的python文件,自然就会报错了。
  2. 必须放在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 参数传入一个字典
 

   

posted @ 2017-09-27 10:58  必有回响  阅读(1066)  评论(0编辑  收藏  举报