jsonpath对json数据进行分析校验做接口测试
在做接口测试的时候, 我们需要对返回的数据进行分析校验, 一般返回的都是json格式的数据, 怎么来解析校验呢? 之前有看过使用递归遍历json数据的, 然后找到了jsonpath, 可以很方便的对json数据进行解析分析。
jsonpath
jsonpath是一种信息抽取类库, 是从json文档中抽取指定信息的工具
jsonpath对于json来说, 相当于xpath对于xml
[官方文档地址](‘http://goessner.net/articles/JsonPath‘)
jsonpath和xpath语法对比
json结构信息, 可读性高, 复杂度低, 非常容易匹配, 下表对应了xpath的用法
| xpath | jsonpath | 描述 |
| / | $ | 根节点 |
| . | @ | 现行节点 |
| / | .or[] | 取子节点 |
| .. | n/a | 父元素 |
| // | .. | 递归下降,所有符合条件的 |
| * | * | 通配符, 表示所有元素 |
| @ | n/a | 属性访问字符 |
| [] | [] | 子元素操作符 |
| [,] | 数组索引 | |
| n/a | [start:end:step] | 数组分割 |
| [] | ?() | 应用过滤表达式 |
jsonpath例子
{
“store”: {
“book”: [
{
“category”: “reference”,
“author”: “Nigel Rees”,
“title”: “Sayings of the Century”,
“price”: 8.95
},
{
“category”: “fiction”,
“author”: “Evelyn Waugh”,
“title”: “Sword of Honour”,
“price”: 12.99
},
{
“category”: “fiction”,
“author”: “Herman Melville”,
“title”: “Moby Dick”,
“isbn”: “0-553-21311-3”,
“price”: 8.99
},
{
“category”: “fiction”,
“author”: “J. R. R. Tolkien”,
“title”: “The Lord of the Rings”,
“isbn”: “0-395-19395-8”,
“price”: 22.99
}
],
“bicycle”: {
“color”: “red”,
“price”: 19.95
}
},
“expensive”: 10
}
有这样一个json数据
| XPath | JSONPath | 结果 |
| /store/book/author | $.store.book[*].author | 所有书的作者 |
| //author | $..author | 所有的作者 |
| /store/* | $.store.* | store的所有元素。所有的bookst和bicycle |
| /store//price | $.store..price | store里面所有东西的price |
| //book[3] | $..book[2] | 第三个书 |
| //book[last()] | $..book[(@.length-1)] | 最后一本书 |
| //book[position()<3] | ..book[:2] | 前面的两本书 |
| //book[isbn] | $..book[?(@.isbn)] | 过滤出所有的包含isbn的书 |
| //book[price<10] | $..book[?(@.price<10)] | 过滤出价格低于10的书。 |
| //* | $..* | 所有元素。 |
那么如何利用jsonpath进行接口测试?
import requests
import jsonpath CHECK_TYPE = (
'equal',
'contains',
'data_size',
'data_type',
)
url = "http://www.lagou.com/lbs/getAllCitySearchLabels.json"
data1 = requests.get(url)
print(data1.json()) citylist = jsonpath.jsonpath(data1.json(), "$..[?(@.name=='安庆')]")
print(citylist)
# 例如我们要校验 parentId是否等于 541
check_dic = {
'key': 'parentId',
'check_type': 'equal',
'value': 541
} # 在jsonpath中它是去找到所有符合path规则的数据, 会以list的形式返回,所以判断是否相等和是否包含其实是一样的, 只要在json中找到 key=value就会返回数据
def check_json(dic, data): if dic['key'] and dic['check_type']:
key = dic['key']
check_type = dic['check_type'] if check_type == 'data_size':
expo = '$..%s' % key
json_data = jsonpath.jsonpath(data.json(), expo)
print('data_size: ' + str(len(json_data[0])))
return json_data = get_json(dic, data)
if json_data:
print('pass')
print(json_data)
else:
print('false')
else:
print('check_dic有问题') def get_json(dic, data): # 判断value是int 还是str
if isinstance(dic['value'], int):
expo = "$..[?(@.%s==%s)]" % (dic['key'], dic['value'])
elif isinstance(dic['value'], str):
expo = "$..[?(@.%s=='%s')]" % (dic['key'], dic['value']) json_data = jsonpath.jsonpath(data.json(), expo)
return json_data check_json(check_dic, data1)
jsonpath对json数据进行分析校验做接口测试的更多相关文章
- FastJson和Gson和Json数据解析分析和用法
首先分析下目前号称最快的FastJson,这个是所有人都验证过的,解析速度确实比较快,不过也需要根据数据量来看,数据量小的时候,Gson性能要稍微优于FastJson,但在数据量大解析的情况下,Fas ...
- swift http请求返回json数据和分析
1 AppDelegate.swift // // AppDelegate.swift // QQDemo // // Created by 赵超 on 14-6-21. // Copyright ( ...
- (数据科学学习手札125)在Python中操纵json数据的最佳方式
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在日常使用Python的过程中,我们经常会 ...
- 使用TSQL查询和更新 JSON 数据
JSON是一个非常流行的,用于数据交换的文本数据(textual data)格式,主要用于Web和移动应用程序中.JSON 使用“键/值对”(Key:Value pair)存储数据,能够表示嵌套键值对 ...
- 使用Gson解析复杂的json数据
Gson解析复杂的json数据 最近在给公司做一个直播APK的项目,主要就是通过解析网络服务器上的json数据,然后将频道地址下载下来再调用Android的播放器进行播放,原先本来打算使用普通的jso ...
- 用JQuery解析获取JSON数据
JSON 是一种比较方便的数据形式,下面使用$.getJSON方法,实现获得JSON数据和解析,都挺方便简单的.从http://api.flickr.com/services/feeds/photos ...
- 使用postman做接口测试(一)
参考大神的总结:https://www.cnblogs.com/Skyyj/p/6856728.html 一,先了解一下基础知识,虽然工作中没什么卵用,但背会了,可以显摆自己很专业的样子,以下内容来自 ...
- Python | JSON 数据解析(Json & JsonPath)
一.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一 ...
- python中jsonpath模块,解析多层嵌套的json数据
1. jsonpath介绍用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, ...
随机推荐
- vim 标签页管理
一.打开关闭标签页 1. :tabnew 新建标签页 2. :tabc 关闭当前标签页 3. :tabo 关闭其他标签页保留当前标签页 4. :tabe file 在新标签页中打开 ...
- DuiVision开发教程(18)-弹出窗
DuiVision的弹出窗体类CDlgPopup,是菜单.下拉列表等控件的父类,也能够单独使用,用于创建弹出窗体.弹出窗体默认是非激活状态下自己主动关闭,比如鼠标点击到弹出窗体外面的区域,弹出窗体就会 ...
- 【SQLServer2008】之如何导入mdf,ldf文件、导入.mdf文件报错解决问题以及如何获得Authenticated Users 权限
一.如何导入mdf,ldf文件: 链接:http://jingyan.baidu.com/article/09ea3ede21258cc0afde3943.html 二.导入.mdf文件报错解决问题 ...
- Esper 20章 优化
20 优化esper为了处理高速的生成力已经高度优化,并且接收事件和输出结果低延迟.esper还可以进一步最大化可测使用在 软实时和硬实时JVM 上. 本章描述了最好的优化练习,而且解释了怎么去评价e ...
- python 常用数据结构
#coding=utf- #元组,不可变序列(,) a=(,,,) print(a) a=tuple([,,,])#第二种定义方式 print(a) print(a[]) print(a[:]) #可 ...
- ios __block typeof 编译错误解决
type specifier missing a parameter list without types is only allowed in a function definition 解决: 工 ...
- Eclipse下使用maven搭建多模块项目
暂时将项目分为如下几层: domain(域模型层).dao(数据库访问层).service(业务逻辑层).web(表现层),有需要再另行添加(如common等): 目录结构: 一.app 该层为父层, ...
- elasticsearch从入门到出门-06-剖析Elasticsearch的基础分布式架构
这个图来自中华石杉:
- mongo explain分析详解
1 为什么要执行explain,什么时候执行 explain的目的是将mongo的黑盒操作白盒化. 比如查询很慢的时候想知道原因. 2 explain的三种模式 2.1 queryPlanner 不会 ...
- 在jsp中嵌入javascript代码执行对html的影响方式
1 javascript的作用范围 javascript操作的是html dom树. 它可以用来直接写入html标签:修改html的内容:响应事件:修改html中的图像:修改html的样式等等. 2 ...