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官方的声明,必须根据返回值的具体类型进行更合适的选择和搭配。