• 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))  #"u4e2du6587" <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'u8bf7u767bu9646u540eu8fdbu884cu64cdu4f5c!', 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'u8bf7u767bu9646u540eu8fdbu884cu64cdu4f5c!', 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 参数传入一个字典
     

       

  • 相关阅读:
    Atitit.atiJsBridge 新特性v7q329
    atitit.userService 用户系统设计 v6 q413
    atitit.userService 用户系统设计 v6 q413
    Atitit.获取某个服务 网络邻居列表 解决方案
    Hasse神舟笔记本卡logo解决,刷BIOS方法,教你修复神船
    Axure RP 8 注册码
    在本地硬盘安装WinPE系统,实现UEFI引导,摆脱U盘
    cmd实现批量文件的base64加密并双击加密文件后正常运行
    cmd的变量总结
    fiddler几种功能强大的用法
  • 原文地址:https://www.cnblogs.com/testeranna/p/7600625.html
Copyright © 2020-2023  润新知