有测试问题请微信联系作者,备注来意(点击此处添加)
240
一名普通的测试打工人;专注自动化测试技术研究、实践、总结、分享、交流。
用我多年的经历,给大家带来更多实用的干货。
人若有志,就不会在半坡停止。

【测试基础】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,则会使用更安全的方式来计算表达式。

其中objexpr是必须参数,即要处理的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()进行获取数量

posted @ 2024-12-11 13:58  三叔测试笔记  阅读(41)  评论(0编辑  收藏  举报
返回顶部 跳转底部