问题描述
我想提取所有昵称为Mack Dack的短信。我该如何使用regularExpression提取器
{"messages":[{"from":{"nickname":"Mack Dack","participantId":2,"type":"Agent"},"index":2,"type":"ParticipantJoined","utcTime":1600262148000},{"from":{"nickname":"Mack Dack","index":4,"text":"Starting the bot: ToBi","type":"Message","utcTime":1600262151000},{"from":{"nickname":"Sonaltest Garg","participantId":1,"type":"Client"},"index":5,"utcTime":1600262161000},"index":7,"text":"Welcome! I am Watson. How can I help?","utcTime":1600262163000},"index":8,"utcTime":1600262174000}],"chatEnded":false,"statusCode":0,"alias":"118","secureKey":"a20dfd835cd8d2199017","userId":"00765F620FFE00A2","chatId":"000BEaFP3FBS003W","nextPosition":9}
我的目的是仅选择来自mack dack的文本消息,如果两个消息相同,则将它们与我的本地json文件进行比较,然后发送Sonaltest Garg相同的消息
解决方法
使用正则表达式解析JSON并不是最好的主意,通常您应该使用JSON Extractor,但特别是在您的情况下,您将无法获得JsonPath的好处因为涉及到JSON数组无法使用子级作为过滤器来查询父级属性。
因此,我宁愿建议使用JSR223 PostProcessor和以下Groovy代码:
def messages = com.jayway.jsonpath.JsonPath.read(prev.getResponseDataAsString(),'$..[?(@.type == "Message")]')
messages.findAll { message ->
message.from.nickname == 'Mack Dack'
}.eachWithIndex { message,index ->
vars.put('message_' + (index + 1),message.text)
}
结果,您将获得以下JMeter Variables:
-
message_1=Starting the bot: ToBi
-
message_2=Welcome! I am Watson. How can I help?
查看Top 8 JMeter Java Classes You Should Be Using with Groovy文章以了解这些prev
和vars
速记的含义