Jmeter使用json提取器进行模糊提取的方法

根据JsonPath的官方文档:GitHub - json-path/JsonPath: Java JsonPath implementation

即下图:

若需要对既有的json内容进行模糊匹配,需要使用以上多种方式,但是更建议使用正则匹配的方式。

$..results[?(@.name=~ /.*CICD/i)].name

表示对results中以CICD结尾的name值进行匹配,/i为不区分大小写,最后取对应的name。 

$..results[?(@.id=~ /ACM(.*?)0045/i)].name

表示对results中满足以ACM开头,且以0045结尾的id进行匹配,/i为不区分大小写,最后取对应的name。 

$..data[?(!(@.plan_name=~ /.*XXXX.*/i))].id

表示对data中不包含XXXX的plan_name进行匹配,最后取对应的id。 

$..dataList[?(@.title in ['不在其中1','不在其中2'])].uuid

表示对dataList中的title是否包含相关内容进行判断,最终返回uuid。取反则改用nin。 

[?(@.price < 10 && @.category == 'fiction')]

[?(@.category == 'reference' || @.price > 10)]

表示可以使用&&和||实现与和或的组合判断。 

$..data[?(!(@.name=~ /.*XXXX.*/i) && !(@.id=~ /.*${id}.*/i))].id

表示对data中的name和id是否包含不相关内容进行判断,最终返回id。取否定使用!(@***)。

附:对于需要取满足json提取器结果的第几个值的情况,需要分两种情况判断:

【1】若Json提取式中不包含判断,例如$..name,则可以直接使用$[*]..name,此时Jmeter完全遵守JsonPath官方的角标声明,从0开始,表示json返回值中实际的第一个数值;

【2】若Json提取式中包含判断,例如$..[?(@.name=~ /126(.*?)/i)].name,则不可以直接使用【1】中的角标方式。此时参考方法如下图,其中的Match.No.设为1代表第一个值(以此递增),0为随机(特殊场合使用),-1为全部。

若无法提前预知json中该字段返回的个数,则推荐将Match.No设为-1,再使用V函数套用_matchNr即可(还可加入Math函数进行特殊需求处理,如倒数第一个,中间位等)。

Json提取和正则提取的使用方式很类似,但是并没有完全遵守JsonPath官方的声明,必须根据返回值的具体类型进行更合适的选择和搭配。

 

 

posted @ 2024-04-03 17:34  子小逗子  Views(93)  Comments(0Edit  收藏  举报