You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因

  1. response.findAll()是遍历整个JSON根节点的键值对(每个it是LinkedHashMap$Entry类型),而非DeskBookings数组,因此it不存在DeskBookings属性。
  2. 响应中DeskID是数值类型,原代码用字符串'29264'比较会导致匹配失败。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:02:41