JMeter中Groovy按DeskID匹配JSON数组对象报错求助
JMeter中筛选JSON数组对象的Groovy代码修正
问题场景
在JMeter的HTTP请求中获取到包含数组的JSON响应,需要从DeskBookings数组中筛选出匹配指定DeskID的对象,编写的Groovy代码运行报错。
响应JSON
{ "Success": true, "RoomRecordsCount": 0, "RoomBookings": [], "DeskRecordsCount": 1, "DeskBookings": [ { "BookingID": 569114, "BookingType": 2, "BookingStart": "11/07/2023 12:00 PM", "BookingEnd": "11/07/2023 23:59 PM", "TimeZoneOffSetInMins": 60, "TimeZone": "GMT Standard Time", "Status": 3, "AdditionalInformation": null, "FloorID": 0, "FloorName": "0", "CountryID": 9, "LocationID": 93, "LocationName": "AJ-LOC", "GroupID": 259, "GroupName": "AJ-GROUP", "DeskID": 29264, "DeskName": "Desk 2", "CanBeBooked": false, "DeskAttributes": null, "WSTypeId": 2, "WsTypeName": "MS Desk", "QRCodeEnabled": false, "bookMultipleDesk": true } ], "EditMiniSyncBooking": false, "Error": { "ErrorCode": 0, "ErrorDescription": "" } }
原Groovy代码
import groovy.json.JsonOutput import groovy.json.JsonSlurper def jsonSlurper = new JsonSlurper(); def response = jsonSlurper.parseText(prev.getResponseDataAsString()); def json = JsonOutput.toJson(response.findAll{ it.DeskBookings.DeskID == '29264' }); vars.put("bookingId", json.BookingID);
错误信息
2023-07-11 00:07:57,966 ERROR o.a.j.e.JSR223PostProcessor: Problem in JSR223 script, JSR223 PostProcessor javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: DeskBookings for class: java.util.LinkedHashMap$Entry
错误原因
response.findAll()是遍历整个JSON根节点的键值对(每个it是LinkedHashMap$Entry类型),而非DeskBookings数组,因此it不存在DeskBookings属性。- 响应中
DeskID是数值类型,原代码用字符串'29264'比较会导致匹配失败。 JsonOutput.toJson()会将筛选结果转为JSON字符串,无法直接通过.BookingID访问属性。
修正后的代码
import groovy.json.JsonSlurper def jsonSlurper = new JsonSlurper() def response = jsonSlurper.parseText(prev.getResponseDataAsString()) // 从DeskBookings数组中筛选匹配DeskID的对象 def matchedBooking = response.DeskBookings.find { it.DeskID == 29264 } // 如果找到匹配对象,提取BookingID并存入JMeter变量 if (matchedBooking) { vars.put("bookingId", matchedBooking.BookingID.toString()) } else { // 未找到时的处理逻辑,可选 vars.put("bookingId", "") }
代码说明
- 直接访问
response.DeskBookings获取目标数组,使用find()方法筛选第一个匹配的对象(若需多个匹配用findAll())。 - 用数值
29264和DeskID比较,保证类型一致。 - 找到匹配对象后,将
BookingID转为字符串存入JMeter变量bookingId,未找到时可设置默认值。
内容的提问来源于stack exchange,提问作者rAJ
相关产品推荐
相关产品推荐

