使用正则表达式Extractor在jmeter中提取应用条件的值

问题描述

我想提取所有昵称为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文章以了解这些prevvars速记的含义

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...