软件测试—Jmeter进阶之Json提取器及JsonPath语法详解

Json数据的组织格式:

一般来说,Json的基本格式为:

{“key”:”value”}

等价于:key=value

PS:

  • 在一个json对象中,可以有多个key,使用逗 进行分隔。
  • value可以是字符串、数字、布尔值、数组、json对象。
  • JsonPath语法详解:

    基本操作符

    $ 根节点

    @ 当前节点,一般来说用于子表达式或者过滤表达式。

    . Or [] 用于连接父子节点

    . Dot-notated方式,获取子节点。

    [‘’ (, ‘’)] Bracket-notated,获取一个或者多个子节点。

    .. 深层扫描,用于获取当前节点下的所有指定对象。

    * 通配符

    [ (, )] 数组索引,如果有多个用逗 分隔。

    [start:end] 数组切片操作

    [?()] 过滤表达式

    假设服务器返回的响应为:

    $ 根节点,表示提取所有的json对象

    示例:

    $ 表示提取整个json对象。

    结果为:

    用于连接父子节点

    示例:

    $.name 表示提取根节点下的name节点的值。

    结果为:

    testingedu

    $.data.student 表示提取根节点下的data节点下的student节点的值。

    结果为:

    [{“sex”:”male”,”grade”:[90,100,95],”name”:”张三”,”id”:”1″,”age”:”20″,”isVIP”:true,”hobby”:[“book”,”game”]},{“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]},{“sex”:”male”,”grade”:[10,100,20],”name”:”李四张”,”id”:”3″,”age”:”26″,”isVIP”:false,”hobby”:[“football”,”game”]},{“sex”:”female”,”grade”:[80,91,85],”name”:”王五”,”id”:”4″,”age”:”30″,”isVIP”:true,”hobby”:[“book”,”travel”,”music”]}]

    $.data.student[*] 表示提取数组student中的所有元素的值。

    结果有四个:

    1. Result[0]={“sex”:”male”,”grade”:[90,100,95],”name”:”张三”,”id”:”1″,”age”:”20″,”isVIP”:true,”hobby”:[“book”,”game”]}
    2. Result[1]={“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]}
    3. Result[2]={“sex”:”male”,”grade”:[10,100,20],”name”:”李四张”,”id”:”3″,”age”:”26″,”isVIP”:false,”hobby”:[“football”,”game”]}
    4. Result[3]={“sex”:”female”,”grade”:[80,91,85],”name”:”王五”,”id”:”4″,”age”:”30″,”isVIP”:true,”hobby”:[“book”,”travel”,”music”]}

    []也可以用来提取子节点的值

    用法:

    示例:

    $[“data”][“student”]

    等价于$.data.student,结果为:

    Result[0]=[{“sex”:”male”,”grade”:[90,100,95],”name”:”张三”,”id”:”1″,”age”:”20″,”isVIP”:true,”hobby”:[“book”,”game”]},{“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]},{“sex”:”male”,”grade”:[10,100,20],”name”:”李四张”,”id”:”3″,”age”:”26″,”isVIP”:false,”hobby”:[“football”,”game”]},{“sex”:”female”,”grade”:[80,91,85],”name”:”王五”,”id”:”4″,”age”:”30″,”isVIP”:true,”hobby”:[“book”,”travel”,”music”]}]

    区别:

    “.”只能连接一个子节点,而[]可以选择多个子节点构成一个新的json结果集。

    示例:

    $[“name”,”expectage”]

    结果为:

    Result[0]={“name”:”testingedu”,”expectage”:”25″}

    .. 深层扫描,用于获取当前节点下的所有指定对象

    .. 在jsonpath中,相当于xpaht中的“//”。

    示例:

    $..name

    表示提取根节点下及其所有的子节点中的name节点的值。

    结果有8个:

    1. Result[0]=testingedu
    2. Result[1]=土匪
    3. Result[2]=will
    4. Result[3]=roy
    5. Result[4]=张三
    6. Result[5]=张三疯
    7. Result[6]=李四张
    8. Result[7]=王五

    $.data..name

    表示提取$.data节点下及其所有的子节点下的name节点的值。

    结果有7个:

    1. Result[0]=土匪
    2. Result[1]=will
    3. Result[2]=roy
    4. Result[3]=张三
    5. Result[4]=张三疯
    6. Result[5]=李四张
    7. Result[6]=王五

    * 通配符

    通配符,表示所有。

    示例:

    $.*

    表示提取根节点下的所有节点的值。

    结果有三个:

    1. Result[0]={“student”:[{“sex”:”male”,”grade”:[90,100,95],”name”:”张三”,”id”:”1″,”age”:”20″,”isVIP”:true,”hobby”:[“book”,”game”]},{“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]},{“sex”:”male”,”grade”:[10,100,20],”name”:”李四张”,”id”:”3″,”age”:”26″,”isVIP”:false,”hobby”:[“football”,”game”]},{“sex”:”female”,”grade”:[80,91,85],”name”:”王五”,”id”:”4″,”age”:”30″,”isVIP”:true,”hobby”:[“book”,”travel”,”music”]}],”teacher”:[{“sex”:”male”,”name”:”土匪”,”adpet”:[“jmeter”,”性能测试”],”id”:”1″,”age”:”40″},{“sex”:”male”,”name”:”will”,”adpet”:[“python”,”自动化”],”id”:”2″,”age”:”28″},{“sex”:”male”,”name”:”roy”,”adpet”:[“java”,”自动化”],”id”:”3″,”age”:”28″}]}
    2. Result[1]=testingedu
    3. Result[2]=25

    数组的处理

    一般来说,针对数组节点我们能够采用的方式主要有:

  • 下标提取。
  • 过滤表达式。
  • 下标提取

  • 提取一个。
  • 数组中第一个元素的下标是0,第二个是1,依次类推。
  • $.data.student[*] 表示提取数组student中的所有元素的值。

    $.data.student[0] 表示提取数组student中的第一个元素的值。

    结果为:

    Result[0]={“sex”:”male”,”grade”:[90,100,95],”name”:”张三”,”id”:”1″,”age”:”20″,”isVIP”:true,”hobby”:[“book”,”game”]}

    $.data.student[3] 表示提取数组student中的第四个元素的值。

    结果为:

    Result[0]={“sex”:”female”,”grade”:[80,91,85],”name”:”王五”,”id”:”4″,”age”:”30″,”isVIP”:true,”hobby”:[“book”,”travel”,”music”]}

    枚举方式

    array[index1,index2,…,indexN]

    示例:

    $.data.student[0,3] 表示提取数组student中的第一个和第四个元素的值。

    结果为:

    1. Result[0]={“sex”:”male”,”grade”:[90,100,95],”name”:”张三”,”id”:”1″,”age”:”20″,”isVIP”:true,”hobby”:[“book”,”game”]}
    2. Result[1]={“sex”:”female”,”grade”:[80,91,85],”name”:”王五”,”id”:”4″,”age”:”30″,”isVIP”:true,”hobby”:[“book”,”travel”,”music”]}

    分片

    格式:

    array[Start:End]

    表示提取数组中半闭半开区间的值,即包含Start,不包含end的下标元素的值。

    示例:

    $.data.student[0:1] 表示提取数组中[0,1)下标元素的值,即下标0的值。

    结果为:

    Result[0]={“sex”:”male”,”grade”:[90,100,95],”name”:”张三”,”id”:”1″,”age”:”20″,”isVIP”:true,”hobby”:[“book”,”game”]}

    $.data.student[1:3] 表示提取数组中[1,3)下标元素的值,即下标1和2的值。

    结果为:

    1. Result[0]={“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]}
    2. Result[1]={“sex”:”male”,”grade”:[10,100,20],”name”:”李四张”,”id”:”3″,”age”:”26″,”isVIP”:false,”hobby”:[“football”,”game”]}

    如果Start为空,则表示从0开始。

    如果End为空,则表示从Start开始到结束的所有下标。

    示例:

    $.data.student[:3] 等价于$.data.student[0:3]

    $.data.student[1:] 表示提取数组中从下标1开始到最后一个元素的值。

    结果为:

    1. Result[0]={“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]}
    2. Result[1]={“sex”:”male”,”grade”:[10,100,20],”name”:”李四张”,”id”:”3″,”age”:”26″,”isVIP”:false,”hobby”:[“football”,”game”]}
    3. Result[2]={“sex”:”female”,”grade”:[80,91,85],”name”:”王五”,”id”:”4″,”age”:”30″,”isVIP”:true,”hobby”:[“book”,”travel”,”music”]}

    特殊格式:

    arrary[:负数]

    arrary[负数:]

    负数下标表示倒数第N个元素,即-1就表示倒数第一个元素,-2表示倒数第二个元素。

    示例:

    $.data.student[:-1] 表示提取数组中除了最后一个元素以外的所有元素。

    结果为:

    1. Result[0]={“sex”:”male”,”grade”:[90,100,95],”name”:”张三”,”id”:”1″,”age”:”20″,”isVIP”:true,”hobby”:[“book”,”game”]}
    2. Result[1]={“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]}
    3. Result[2]={“sex”:”male”,”grade”:[10,100,20],”name”:”李四张”,”id”:”3″,”age”:”26″,”isVIP”:false,”hobby”:[“football”,”game”]}

    $.data.student[-2:] 表示提取数组中最后两个元素。

    结果为:

    1. Result[0]={“sex”:”male”,”grade”:[10,100,20],”name”:”李四张”,”id”:”3″,”age”:”26″,”isVIP”:false,”hobby”:[“football”,”game”]}
    2. Result[1]={“sex”:”female”,”grade”:[80,91,85],”name”:”王五”,”id”:”4″,”age”:”30″,”isVIP”:true,”hobby”:[“book”,”travel”,”music”]}

    $.data.student[-3:-1] 表示提取数组中倒数第三和倒数第二个元素。

    结果为:

    1. Result[0]={“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]}
    2. Result[1]={“sex”:”male”,”grade”:[10,100,20],”name”:”李四张”,”id”:”3″,”age”:”26″,”isVIP”:false,”hobby”:[“football”,”game”]}

    过滤表达式

    对于复杂的业务需求,我们可以通过过滤表达式的方式来对数组的元素进行过滤,从而获取我们要的值。

    常用的操作符:

    ==、!=、<、<=、>、>=

    =~ 正则匹配

    In 存在于

    Nin 不存在于

    Subsetof 子集

    或者

    && 并且

    语法格式为:

    array[?(过滤表达式)]

    在过滤表达式中,一般会使用@来表示当前对象。

    示例:

    $.data.student[?(@.isVIP==true)]

    student是一个数组节点,数组的值是json对象。

    获取的是isVIP=true的数组元素。

    结果为:

    1. Result[0]={“sex”:”male”,”grade”:[90,100,95],”name”:”张三”,”id”:”1″,”age”:”20″,”isVIP”:true,”hobby”:[“book”,”game”]}
    2. Result[1]={“sex”:”female”,”grade”:[80,91,85],”name”:”王五”,”id”:”4″,”age”:”30″,”isVIP”:true,”hobby”:[“book”,”travel”,”music”]}

    $.data.student[?(@.isVIP!=true)]

    结果为:

    1. Result[0]={“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]}
    2. Result[1]={“sex”:”male”,”grade”:[10,100,20],”name”:”李四张”,”id”:”3″,”age”:”26″,”isVIP”:false,”hobby”:[“football”,”game”]}

    $.data.student[?(@.age>=”25″)]

    表示提取年龄大于等于25的student对象。

    结果为:

    1. Result[0]={“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]}
    2. Result[1]={“sex”:”male”,”grade”:[10,100,20],”name”:”李四张”,”id”:”3″,”age”:”26″,”isVIP”:false,”hobby”:[“football”,”game”]}
    3. Result[2]={“sex”:”female”,”grade”:[80,91,85],”name”:”王五”,”id”:”4″,”age”:”30″,”isVIP”:true,”hobby”:[“book”,”travel”,”music”]}

    $.data.student[?(@.age>=”25″ && @.sex==”female”) ]

    表示提取年龄大于等于25且性别为”female”的student对象。

    结果为:

    1. Result[0]={“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]}
    2. Result[1]={“sex”:”female”,”grade”:[80,91,85],”name”:”王五”,”id”:”4″,”age”:”30″,”isVIP”:true,”hobby”:[“book”,”travel”,”music”]}

    =~ 表示通过正则的方式来过滤。。

    写法为:array[?(@.key =~ /正则表达式/)]

    示例:

    $.data.student[?(@.name =~ /张.*/)]

    表示提取student中姓张的学生的信息。

    结果为:

    1. Result[0]={“sex”:”male”,”grade”:[90,100,95],”name”:”张三”,”id”:”1″,”age”:”20″,”isVIP”:true,”hobby”:[“book”,”game”]}
    2. Result[1]={“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]}

    $.data.student[?(@.name =~ /.*张.*/)]

    表示提取student中姓名包含字符”张”的学生的信息。

    结果为:

    1. Result[0]={“sex”:”male”,”grade”:[90,100,95],”name”:”张三”,”id”:”1″,”age”:”20″,”isVIP”:true,”hobby”:[“book”,”game”]}
    2. Result[1]={“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]}
    3. Result[2]={“sex”:”male”,”grade”:[10,100,20],”name”:”李四张”,”id”:”3″,”age”:”26″,”isVIP”:false,”hobby”:[“football”,”game”]}

    $.data.student[?(@.name =~ /张.{1}/)]

    表示提取student中姓张X的学生的信息。

    结果为:

    Result[0]={“sex”:”male”,”grade”:[90,100,95],”name”:”张三”,”id”:”1″,”age”:”20″,”isVIP”:true,”hobby”:[“book”,”game”]}

    in 表示存在于指定的数组中

    示例:

    data.student[?(@.age in [“25″,”26”])]

    等价于

    data.student[?(@.age==”25″ || @.age==”26″)]

    nin 表示不存在于

    .data.student[?(@.age nin [“25″,”26”])]

    等价于

    data.student[?(@.age!=”25″ && @.age!=”26″)]

    subSetof

    表示某一个数组节点的值是指定的数组的子集。

    示例:

    $.data.student[?(@.hobby subsetof [“book”,”game”,”football”])]

    表示提取student中,爱好为[“book”,”game”,”football”]的子集的学生信息。

    结果为:

    1. Result[0]={“sex”:”male”,”grade”:[90,100,95],”name”:”张三”,”id”:”1″,”age”:”20″,”isVIP”:true,”hobby”:[“book”,”game”]}
    2. Result[1]={“sex”:”female”,”grade”:[60,80,95],”name”:”张三疯”,”id”:”2″,”age”:”25″,”isVIP”:false,”hobby”:[“book”]}
    3. Result[2]={“sex”:”male”,”grade”:[10,100,20],”name”:”李四张”,”id”:”3″,”age”:”26″,”isVIP”:false,”hobby”:[“football”,”game”]}

    Json提取器详解

    Apply to:

    用来指定Json提取器的作用对象,可选对象有三个:

  • Main sample:主请求
  • Sub sample:子请求
  • Jmeter Variable:Jmeter变量
  • 详细用法请参照Jmeter的正则表达式提取器使用详解。

    Names of created variables:

    变量名称s,该处可以填写一个or多个变量名称。

    注意事项:

    1. 如果有多个变量名称,使用分 ”;”作为分隔符。
    2. 变量名称的数量要和下方的JsonPath表达式的数量保持一致。

    JSON Path expressions:

    JsonPath表达式,即用来提取Json对象中的值的表达式。

    注意事项:

    1. JsonPath表达式可以填写多个,使用分 ”;”作为分隔符。
    2. JsonPath表达式的数量要求和变量名称数量保持一致。

    Match No:

    匹配数字,可以填写的有三类数字:

  • 0 随机,如果不填写or填写错误,则默认也是0。
  • N 正整数N,用来指定将多个匹配结果中的第N个值赋值给变量。
  • 负数 默认是-1,表示将所有匹配的值以类似于数组的方式存入变量。
  • 注意事项:

    如果存在多个Json Path表达式,则匹配数字也要指定多个,且使用分 进行分隔。。否则不指定的就默认使用0.

    Compute concatenation var(suffix_aALL):

    表示使用逗 作为分隔符,将所有匹配到的值连接为一个变量。

    示例:

    Default value:

    默认值,即表示如果JsonPath表达式没有找到值,则将默认值赋值给变量。

    注意事项:

  • 如果变量名称只有一个,则默认值可以不填。
  • 如果变量名称有多个,则默认值必须填写,且数量要求和变量名称保持一致,使用分 ”;”作为分隔符。
  • 若有收获,就点个赞吧

    END

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年3月18日
    下一篇 2022年3月18日

    相关推荐