【测试基础】jsonpath使用详解
jsonpath介绍
JsonPath是用来解析多层嵌套的JSON数据。可以认为JsonPath就是JSON版本的XPath。
它是一种信息抽取类库,是从JSON文档中抽取指定信息的工具。JsonPath对于JSON来说,就相当于XPath之于XML。
JsonPath在线解析:https://jsonpath.com/
python在进行接口关联的时候经常会用到参数提取,对于json格式的提取时jsonpath提取器就很常用
jsonpath函数
特点:只能提取json格式的数据,提取后的数据类型与原数据类型一致
我们在使用jsonpath的时候一般是使用它里面的jsonpath函数,即jsonpath.jsonpath()
。
jsonpath()接受5个参数,如下
jsonpath(obj, expr, result_type='VALUE', debug=0, use_eval=True)
- obj:要搜索的 JSON 对象。
- expr:JSONPath 表达式,用于指定要提取的值的路径。
- result_type:可选参数,用于指定返回结果的类型。默认为 ‘VALUE’,表示返回匹配到的值;还可以选择 ‘PATH’,表示返回匹配到的路径;或者选择 ‘BOTH’,表示同时返回匹配到的值和路径。
- debug:可选参数,用于控制调试模式。默认为 0,表示关闭调试模式;设置为 1,则会在控制台输出调试信息。
- use_eval:可选参数,用于指定是否使用 eval() 函数来计算表达式。默认为 True,表示使用 eval();设置为 False,则会使用更安全的方式来计算表达式。
其中obj和expr是必须参数,即要处理的json数据对象和提取表达式,常用的就是这两个参数,其他参数可以根据个人需要赋值。
jsonpath表达式expr
jsonpath的匹配表达式规则和xpath对应关系如下,为空表示不支持,如下
xpath | jsonpath | 描述 |
---|---|---|
/ | $ | 从根节点开始匹配 |
. | @ | 从当前节点开始匹配 |
/ | .节点 or [节点1,节点2] | 取子节点 |
. . | 取父节点,jsonpath不支持 | |
// | . . | 就是不管位置,选择所有符合条件的条件(递归匹配) |
* | * | 匹配所有节点 |
@ | ||
[ ] | [ ] | 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等) |
| | [ , ] | 支持迭代器中做多选 |
[ ] | ?() | 支持过滤操作---需要加一层表达式[] |
( ) | 支持表达式计算 | |
( ) | 分组 |
过滤器
过滤器是用于过滤数组的逻辑表达式,一个通常的表达式形如:[?(@.age > 18)]
,可以通过逻辑表达式&&
或||
组合多个过滤器表达式
例如$..book[?(@.price < 10 && @.category == 'fiction')]
字符串必须用单引号包围,例如[?(@.color == 'blue')]
操作符 | 描述 |
---|---|
== | 等于符号,但数字1不等于字符1(1 is not equal to ‘1’) |
!= | 不等于 |
< | 小于 |
<= | 小于等于 |
> | 大于等于 |
>= | 大于等于 |
=~ | 判断是否符合正则表达式,例如[?(@.name =~ /foo.*?/i)] |
in | 属于,例如[?(@.size in ['S', 'M'])] |
nin | 排除符号 |
size | 左侧(数组或字符串)的大小应与右侧一致 |
empty | 数组或字符串)应为空 |
subsetof | 左是右的子集 [?(@.sizes subsetof [‘S’, ‘M’, ‘L’])] |
anyof | 左与右有交集 [?(@.sizes anyof [‘M’, ‘L’])] |
noneof | 左边与右边没有交集 [?(@.sizes noneof [‘M’, ‘L’])] |
示例
{
"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
}
JsonPath | Result |
---|---|
$.store.book[*].author | 所有书籍的作者 |
$..author | 所有作者 |
$..book[2] | 第3本数 |
$..book[0,1] | 前2本数 |
$..book[1:3] | 切片操作,从索引 1(含)到索引 3(不含)的所有书籍 |
$..book[-1:] | 倒数第一本数 |
$..book[?(@.isbn)] | 所有有 ISBN 编号的书籍 |
$.store.book[?(@.price < 10)] | 价格低于10的所有数据 |
$..book.length | 书籍的数量 |
$..book[?(@.price < 10 && @.category == 'fiction')] | 所有price下价格小于10 and category等于fiction的数据 |
$..book[?(@.price < 10 || @.category == 'fiction')] | 所有price下价格小于10 or category等于fiction的数据 |
length在python中无法使用,可以先取列表然后用len()进行获取数量
============================= 提升自己 ==========================
进群交流、获取更多干货, 请关注微信公众号:
> > > 咨询交流、进群,请加微信,备注来意:sanshu1318 (←点击获取二维码)
> > > 学习路线+测试实用干货精选汇总:
https://www.cnblogs.com/upstudy/p/15859768.html
> > > 【自动化测试实战】python+requests+Pytest+Excel+Allure,测试都在学的热门技术:
https://www.cnblogs.com/upstudy/p/15921045.html
> > > 【热门测试技术,建议收藏备用】项目实战、简历、笔试题、面试题、职业规划:
https://www.cnblogs.com/upstudy/p/15901367.html
> > > 声明:如有侵权,请联系删除。
============================= 升职加薪 ==========================
更多干货,正在挤时间不断更新中,敬请关注+期待。
进群交流、获取更多干货, 请关注微信公众号:
> > > 咨询交流、进群,请加微信,备注来意:sanshu1318 (←点击获取二维码)
> > > 学习路线+测试实用干货精选汇总:
https://www.cnblogs.com/upstudy/p/15859768.html
> > > 【自动化测试实战】python+requests+Pytest+Excel+Allure,测试都在学的热门技术:
https://www.cnblogs.com/upstudy/p/15921045.html
> > > 【热门测试技术,建议收藏备用】项目实战、简历、笔试题、面试题、职业规划:
https://www.cnblogs.com/upstudy/p/15901367.html
> > > 声明:如有侵权,请联系删除。
============================= 升职加薪 ==========================
更多干货,正在挤时间不断更新中,敬请关注+期待。