【测试基础】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
> > > 声明:如有侵权,请联系删除。
============================= 升职加薪 ==========================
更多干货,正在挤时间不断更新中,敬请关注+期待。
浙公网安备 33010602011771号