在JMeter中基于isFolder条件提取JSON指定ID的方法
提取JSON中isFolder为false的对象ID问题
问题描述
我有一个包含嵌套数组的JSON响应,需要提取所有isFolder属性为false的对象的id。尝试使用JSON提取器执行以下两个表达式,但调试取样器显示变量为空,无法成功提取:
$.data.tileGrid.items[?(@.isFolder == false)][1].id
$..[?(@.isFolder == false)].id
对应的JSON响应结构如下:
{ "data": { "navigation": { "hasNextPage": true, "urlNextPage": "\/docs\/shared\/?nav-folder_list_14=page-2", "pageSize": 50, "currentPage": 1 }, "tileGrid": { "itemType": "BX.Disk.TileGrid.Item", "id": "folder_list_14", "items": [ { "isFile": false, "canAdd": true, "link": "\/docs\/shared\/path\/%D0%9F%D0%9A%D0%9E\/", "isFolder": true, "id": "6789192", "isSymlink": false }, ... { "isFile": true, "canAdd": true, "link": "\/docs\/shared\/path\/%D0%9F%D0%9A%D0%9E\/", "isFolder": false, "id": "6789192", "isSymlink": false } ] } } }
问题分析与解决方法
原有表达式的问题
- 第一个表达式中
[1]指定取过滤后数组的第2个元素(JPath索引从0开始),若过滤结果数量不足则取不到值;且要提取所有符合条件的ID,不应添加该索引限制。 - 第二个表达式用
$..递归遍历所有节点,JMeter的JSON提取器基于Jayway JsonPath,这种递归过滤写法可能因结构匹配偏差导致取不到值。
正确的JPath表达式
要提取所有符合条件的id,使用以下表达式:
$.data.tileGrid.items[?(@.isFolder == false)].id
JMeter JSON提取器关键设置
- Match No.:设置为
-1,表示提取所有匹配到的ID,而非仅第一个。 - 变量名:自定义变量名(如
fileIds),提取后会生成fileIds_1、fileIds_2等变量,同时fileIds_matchNr会返回匹配到的总数。
完成上述设置后,调试取样器即可显示所有成功提取的目标ID。
内容的提问来源于stack exchange,提问作者Cavaleriy
相关产品推荐
相关产品推荐

