前言

​ JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它可以让人们很容易的进行阅读和编写,同时也方便了机器进行解析和生成,适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。简单说就是javascript中的对象和数组,通过这两种结构可以表示各种复杂的结构。

对象:对象在js中是花括号{}括起来的内容,数据结构为{key:value,key:value,...}这样的键值对结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为对象.key来获取属性值,这个属性值的类型可以是数字、字符串、数组、对象这几种。

数组:数组在js中是中括号[]括起来的内容,数据结构为["Python", "javascript", "C++",..],类似python中的列表,取值方式和所有语言中一样,使用索引获取,字段值的类型可以是数字、字符串、数组、对象几种。

json模块

​ 在之前的request库介绍中就提到过,现在99%的接口返回的数据都是json格式,在python中,有专门处理json格式的模块——json模块,在python2.6之后的版本都自带了这一个模块,直接导入import json即可。json模块提供了四个功能:dumpsloadsdumpload,用于字符串和python数据类型之间进行转换。

  • json.dumps():将 Python 对象解码转换成 JSON 字符串
  • json.loads():把JSON 格式字符串解码转换成Python 对象
  • json.dump():将Python内置类型序列化为JSON 对象后写入文件
  • json.load():读取文件中JSON 形式的字符串元素转化成Python 类型

​ 其中类文件对象的理解,其实就是具有read()或者write()方法的对象,比如f = open("test.txt","r") f就是类文件对象。下面对dumpsloads分别举例说明:

import json

data = [{'a': 1, 'b': 2, 'c': 3}]
data2 = json.dumps(data) # 将python对象转换成json字符串
print(data2)
print(type(data2))
print("-------还可以使用参数格式化输出json格式--------")
print(json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '))) jsonData = '{"a":1,"b":2,"c":3,"d":4,"e":5}'
text = json.loads(jsonData)
print("---------json转python---------")
print(text)
print(type(jsonData)) # 返回结果如下:
# C:\software\python\python.exe D:/learn/test.py
# [{"a": 1, "b": 2, "c": 3}]
# <class 'str'>
# -------还可以使用参数格式化输出json格式--------
# [
# {
# "a": 1,
# "b": 2,
# "c": 3
# }
# ]
# ---------json转python---------
# {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
# <class 'str'>
#
# Process finished with exit code 0

dumps解码的过程,是把python对象转换成json对象的一个过程,常用的两个函数是dumpsdump函数。两个函数的唯一区别就是dump把python对象转换成json对象生成一个fp的文件流,而dumps则是生成了一个字符串。

解码中常用的参数

  • Skipkeys:默认值是False,如果dict的keys内的数据不是python的基本类型(str,unicode,int,long,float,bool,None),设置为False时,就会报TypeError的错误。此时设置成True,则会跳过这类key
  • ensure_ascii:默认值True,如果dict内含有non-ASCII的字符,则会类似\uXXXX的显示数据,设置成False后,就能正常显示
  • indent:应该是一个非负的整型,如果是0,或者为空,则一行显示数据,否则会换行且按照indent的数量显示前面的空白,这样打印出来的json数据也叫pretty-printed json
  • separators:分隔符,实际上是(item_separator, dict_separator)的一个元组,默认的就是(',',';这表示dictionary内keys之间用“,”隔开,而KEY和value之间用“:”隔开
  • encoding:默认是UTF-8,设置json数据的编码方式
  • sort_keys:将数据根据keys的值进行排序。

​ python 类型向 json 类型的转化对照表如下:

Python JSON
dict object(对象)
list, tuple array(数组)
str, unicode string
int, long, float number
True true
False false
None null

​ 反之,json 类型转换到 python 的类型对照表:

JSON Python
object(对象) dict
array(数组) list
string unicode
number (int) int, long
number (real) float
true True
false False
null None

特别注意:转换的时候,python的None会变成nullTrueFalse转换后首字母都会变成小写噢!他们的json格式在python中是无法被识别的,会被当成变量处理。

​ 更多的相关内容,可以查阅python的官方文档:https://docs.python.org/2/library/json.html

jsonpath库

​ JsonPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括JavaScript、Python、PHP和Java。JsonPath对于JSON来说,就相当于XPATH对于XML。JsonPath结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。

Xpath JSONPath 描述
/ $ 根节点
. @ 现行节点
/ . or [] 取子节点
.. n/a 取父节点,Jsonpath未支持
// .. 不管位置,选择所有符合条件的节点
* * 匹配所有元素节点
@ n/a 根据属性访问,JsonPath不支持
[] [] 迭代器(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
| [,] 支持迭代器中做多选
[] ?() 支持过滤操作
n/a () 支持表达式计算
() n/a 分组,JsonPath不支持
  • pip安装pip install jsonpath,官网文档:http://goessner.net/articles/JsonPath
  • 使用方法jsonpath.jsonpath(),结果会以列表形式返回,如下请求接口返回数据提取例子
    • 参数1:数据对象
    • 参数2:jsonpath表达式
import requests
import jsonpath login_url = "http://localhost:8080/member/login"
login_data = {
"mobile_phone": "15867554893",
"pwd": "123456qwe",
}
header = { "Content-Type": "application/json"}
# 发送登录的请求
response = requests.post(url=login_url, json=login_data, headers=header)
# 获取返回的json数据
json_data = response.json() member_id = jsonpath.jsonpath(json_data, "$..id")[0]
type_token = jsonpath.jsonpath(json_data, "$..token_type")[0]
token = jsonpath.jsonpath(json_data, "$..token")[0]
print(json_data)
print("会员id:{}".format(member_id))
print("token的类型:{}".format(type_token))
print("token:{}".format(token))

​ 运行返回的数据如下:

C:\software\python\python.exe D:/learn/test.py
{'code': 0, 'msg': 'OK', 'data': {'id': 59514, 'money': 34000.0, 'mobile_phone': '15612345678', 'reg_name': 'miki测试', 'reg_time': '2020-11-16 22:18:59.0', 'type': 0, 'token_info': {'token_type': 'Bearer', 'expires_in': '2020-12-10 00:30:01', 'token': 'eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjU5NTE0LCJleHAiOjE2MDc1MzE0MDF9.GAoCY5RZ_FWUIRMNXdURdH5y7zKuETo1qsq9Z9No9AaWvo2QGLR9maWxEY31Ddy6a7QmpT56xKg7N3YwGLTbOQ'}}}
会员id:59514
token的类型:Bearer
token:eyJhbGciOiJIUzUxMiJ9.eyJtZW1iZXJfaWQiOjU5NTE0LCJleHAiOjE2MDc1MzE0MDF9.GAoCY5RZ_FWUIRMNXdURdH5y7zKuETo1qsq9Z9No9AaWvo2QGLR9maWxEY31Ddy6a7QmpT56xKg7N3YwGLTbOQ

​ 登录接口返回的json数据格式化后的层级显示如下:

【python接口自动化】- 使用json及jsonpath转换和提取数据的更多相关文章

  1. python接口自动化读取json,yaml配置文件+封装requests+unittest+HTMLRunner实现全自动化

    # coding=utf-8 import json import requests class TestApi(object): """ /* @param: @ses ...

  2. python接口自动化-传 json 参数

    一.post请求有两种方法传json参数: 1.传json参数(自动转 json ) 2.传data参数(需 json 转换) 代码参考: payload = { "Jodie": ...

  3. python接口自动化13-data和json参数傻傻分不清

    前言 在发post请求的时候,有时候body部分要传data参数,有时候body部分又要传json参数,那么问题来了:到底什么时候该传json,什么时候该传data? 一.识别json参数 1.在前面 ...

  4. python接口自动化(post请求)

    python接口自动化(post请求) 一.post请求的作用:新增资源 二.data格式的参数请求(data是字典对象) #1.导包 import requests #2.调用post方法 #请求的 ...

  5. python接口自动化(十)--post请求四种传送正文方式(详解)

    简介 post请求我在python接口自动化(八)--发送post请求的接口(详解)已经讲过一部分了,主要是发送一些较长的数据,还有就是数据比较安全等.我们要知道post请求四种传送正文方式首先需要先 ...

  6. python接口自动化-参数化

    原文地址https://www.cnblogs.com/yoyoketang/p/6891710.html python接口自动化 -参数关联(一)https://www.cnblogs.com/11 ...

  7. python接口自动化 -参数关联(一)

    原文地址https://www.cnblogs.com/yoyoketang/p/6886610.html 原文地址https://www.cnblogs.com/yoyoketang/ 原文地址ht ...

  8. python接口自动化5-Json数据处理

    前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的 ...

  9. python接口自动化3-自动发帖(session)

    前言 上一篇模拟登录博客园,但这只是第一步,一般登录后,还会有其它的操作,如发帖,评论等,这时候如何保持会话呢? (敲黑板!!!由于博客园最近登录机制变了,登录全部走cookie登录) 一.sessi ...

随机推荐

  1. rgw配置删除快速回收对象

    前言 做rgw测试的时候,经常会有删除文件的操作,而用默认的参数的时候,rgw是通过gc回收机制来处理删除对象的,这个对于生产环境是有好处的,把删除对业务系统的压力分摊到不同的时间点,但是测试的时候, ...

  2. Java字符类型(详解)

    [1]Java中使用单引号来表示字符常量,字符型在内存中占2个字节. char 类型用来表示在Unicode编码表中的字符.Unicode编码被设计用来处理各种语言的文字,它占2个字节,可允许有655 ...

  3. windows 无法启动 SQL Server (MSSQLSERVER) 服务(位于本地计算机上)。错误 1069由于登入失败而无法启动 。

    windows 无法启动 SQL Server (MSSQLSERVER) 服务(位于本地计算机上).错误 1069由于登入失败而无法启动. 今天登录测试服务器突然出现无法登录的情况,经排查发现,SQ ...

  4. Java 开发之 Lombok 必知必会

    转载链接地址:https://juejin.im/post/5cf3edf7e51d454f71439c79 1. 前言 在目前众多编程语言中,Java 语言的表现还是抢眼,不论是企业级服务端开发,还 ...

  5. Gulp自动化构建的基本使用

    Study Notes 本博主会持续更新各种前端的技术,如果各位道友喜欢,可以关注.收藏.点赞下本博主的文章. Gulp 用自动化构建工具增强你的工作流程! gulp 将开发流程中让人痛苦或耗时的任务 ...

  6. configure.ac和Makefile.am的格式解析概述

    1. configure.ac和Makefile.am的格式解析概述 1.1. Autotools相关工具链 1.1.1. Autotools 1.1.2. 其他相关工具 1.2. 工具链的流程 1. ...

  7. 应届生应聘阿里,腾讯,美团90%会被问到的Netty面试题!史上最全系列!

    1.BIO.NIO 和 AIO 的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理.线程开销大.伪异步 IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源 ...

  8. ABBYY FineReader 14创建PDF文档功能解析

    使用ABBYY FineReader,您可以轻松查看和编辑任何类型的 PDF,真的是一款实至名归的PDF编辑转换器,您知道的,它能够保护.签署和编辑PDF文档,甚至还可以创建PDF文档,本文和小编一起 ...

  9. ntfs和fat32的区别

    ntfs和fat32是两种不同的磁盘文件系统格式,虽然他们有一定的相似点,但还是具有很大的差异.今天,小编就带大家了解一下ntfs和fat32的区别. 图1 :u盘 一.分区容量 fat32能够有效管 ...

  10. 电子邮件怎么用EasyRecovery恢复,只需简单5步

    在日常工作中,我们常常会用电子邮件与上事.客户等协商工作事务.电子邮件快捷.方便,慢慢地成为我们工作中不可缺少的沟通工具之一. 然而使用的过程中,你会发现垃圾邮件也越积越多了,平时,我看到积压的垃圾邮 ...