Jmeter JSON 一个节点为空的提取器
Jmeter JSON Extractor with one node empty
我有一个 JSON 这样的回复
`{
"data": [
{
"id": "1",
"type": "status",
"created_time": "2010-08-02T22:27:44+0000",
"updated_time": "2010-08-02T22:27:44+0000"
},
{
"id": "2",
"message": "JSON is much easier and better than XML",
"created_time": "2010-08-02T25:27:44+0000",
"updated_time": "2010-08-02T25:27:44+0000"
},
{
"id": "3",
"created_time": "2010-08-02T25:27:44+0000",
"updated_time": "2010-08-02T25:27:44+0000"
},
{
"id": "4",
"message": "JSON is much easier and better than XML",
"created_time": "2010-08-02T25:27:44+0000",
"updated_time": "2010-08-02T25:27:44+0000"
},
{
"id": "5",
"created_time": "2010-08-02T25:27:44+0000",
"updated_time": "2010-08-02T25:27:44+0000"
},
{
"id": "6",
"message": "JSON is much easier and better than XML",
"created_time": "2010-08-02T25:27:44+0000",
"updated_time": "2010-08-02T25:27:44+0000"
}
]
}`
现在您可以看到节点 1、3 和 5 缺少消息字段
我正在使用匹配号为 -1 的 json 提取器提取 id、消息、created_time 和 updated_time 的值
值被正确提取我是他们使用 ID_matchNr 将它们写入 for 循环内的 CSV 文件以获得最大数量但是我面临的问题是因为我们在节点 1 中没有任何值但是当我写它写入节点 2 的消息值。
如何为节点 1、3 和 5 的消息写入 null?
我认为的一个选项是添加一个虚拟采样器并使用相同的有效负载并使用条件 json 提取器提取消息值,该提取器基于从第一个采样器响应中提取的 ID。
我认为的另一个选择是使用 foreachcontroller 并使用采样器写入文件这是我可以使用 id 的相应消息值但是这将再次有另一个 beanshell 采样器写入文件。
但我希望有更简单的解决方案,而不是提出另一个采样器请求
这是我希望 CSV 文件数据的样子:
为此,您需要在 Java.
中使用 JSON Class 解析 JSON 响应
从 Maven Repository 获取 JSON 库并将其放入 JMeter Classpath
确保重启 JMeter
使用JSON提取器提取完整的JSON响应
将以下 JAVA 代码放入 JSR223 采样器和 select 语言中作为 java
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
String response = vars.get("jsonOutput");
JSONObject myObject = new JSONObject(response);
JSONArray data = myObject.optJSONArray("data");
log.info("ID\tType\t\tMessage\tCreated Time\tUpdated Time");
for (int i = 0, size = data.length(); i < size; i++) {
JSONObject objectInArray = data.getJSONObject(i);
String id = objectInArray.optString("id");
String type = objectInArray.optString("type");
String created_time = objectInArray.optString("created_time");
String updated_time = objectInArray.optString("updated_time");
String message = objectInArray.optString("message");
if(id.isEmpty()) {
id = null;
}
if(type.isEmpty()) {
type = null;
}
if(created_time.isEmpty()) {
created_time = null;
}
if(updated_time.isEmpty()) {
updated_time = null;
}
if(message.isEmpty()) {
message = null;
}
log.info(id + "\t" + type + "\t" + message + "\t" + created_time + "\t" + updated_time);
}
非常感谢@SAIR,这太棒了,我不是编码员,但设法解决了我的问题。这解决了我当前和未来的很多问题,现在我不必在 foreach 控制器中调用虚拟采样器。
我添加了另一行来提取嵌套字段这是我正在使用的修改后的代码
JSONObject NameobjectInArray = objectInArray.getJSONObject("Name"); -- **I used this to get the nested fields**
字符串名字 = NameobjectInArray.optString("FirstName");
你可以考虑使用JSR223 PostProcessor and JsonSlurper组合来一次完成
- 将 JSR223 后处理器添加为 returns 以上 JSON
请求的子项
将以下代码放入"Script"区域:
new groovy.json.JsonSlurper().parse(prev.getResponseData()).data.each { entry ->
new File('myfile.csv') << entry.id << ',' << entry.message << ',' << entry.created_time << ',' << entry.updated_time << System.getProperty('line.separator')
}
就是这样,一旦你 运行 你的测试你将 myfile.csv
将在你 JMeter 安装的 "bin" 文件夹中生成,如下所示:
1,null,2010-08-02T22:27:44+0000,2010-08-02T22:27:44+0000
2,JSON is much easier and better than XML,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000
3,null,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000
4,JSON is much easier and better than XML,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000
5,null,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000
6,JSON is much easier and better than XML,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000
我有一个 JSON 这样的回复
`{
"data": [
{
"id": "1",
"type": "status",
"created_time": "2010-08-02T22:27:44+0000",
"updated_time": "2010-08-02T22:27:44+0000"
},
{
"id": "2",
"message": "JSON is much easier and better than XML",
"created_time": "2010-08-02T25:27:44+0000",
"updated_time": "2010-08-02T25:27:44+0000"
},
{
"id": "3",
"created_time": "2010-08-02T25:27:44+0000",
"updated_time": "2010-08-02T25:27:44+0000"
},
{
"id": "4",
"message": "JSON is much easier and better than XML",
"created_time": "2010-08-02T25:27:44+0000",
"updated_time": "2010-08-02T25:27:44+0000"
},
{
"id": "5",
"created_time": "2010-08-02T25:27:44+0000",
"updated_time": "2010-08-02T25:27:44+0000"
},
{
"id": "6",
"message": "JSON is much easier and better than XML",
"created_time": "2010-08-02T25:27:44+0000",
"updated_time": "2010-08-02T25:27:44+0000"
}
]
}`
现在您可以看到节点 1、3 和 5 缺少消息字段 我正在使用匹配号为 -1 的 json 提取器提取 id、消息、created_time 和 updated_time 的值 值被正确提取我是他们使用 ID_matchNr 将它们写入 for 循环内的 CSV 文件以获得最大数量但是我面临的问题是因为我们在节点 1 中没有任何值但是当我写它写入节点 2 的消息值。
如何为节点 1、3 和 5 的消息写入 null?
我认为的一个选项是添加一个虚拟采样器并使用相同的有效负载并使用条件 json 提取器提取消息值,该提取器基于从第一个采样器响应中提取的 ID。
我认为的另一个选择是使用 foreachcontroller 并使用采样器写入文件这是我可以使用 id 的相应消息值但是这将再次有另一个 beanshell 采样器写入文件。
但我希望有更简单的解决方案,而不是提出另一个采样器请求
这是我希望 CSV 文件数据的样子:
为此,您需要在 Java.
中使用 JSON Class 解析 JSON 响应从 Maven Repository 获取 JSON 库并将其放入 JMeter Classpath
确保重启 JMeter
使用JSON提取器提取完整的JSON响应
将以下 JAVA 代码放入 JSR223 采样器和 select 语言中作为 java
import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; String response = vars.get("jsonOutput"); JSONObject myObject = new JSONObject(response); JSONArray data = myObject.optJSONArray("data"); log.info("ID\tType\t\tMessage\tCreated Time\tUpdated Time"); for (int i = 0, size = data.length(); i < size; i++) { JSONObject objectInArray = data.getJSONObject(i); String id = objectInArray.optString("id"); String type = objectInArray.optString("type"); String created_time = objectInArray.optString("created_time"); String updated_time = objectInArray.optString("updated_time"); String message = objectInArray.optString("message"); if(id.isEmpty()) { id = null; } if(type.isEmpty()) { type = null; } if(created_time.isEmpty()) { created_time = null; } if(updated_time.isEmpty()) { updated_time = null; } if(message.isEmpty()) { message = null; } log.info(id + "\t" + type + "\t" + message + "\t" + created_time + "\t" + updated_time); }
非常感谢@SAIR,这太棒了,我不是编码员,但设法解决了我的问题。这解决了我当前和未来的很多问题,现在我不必在 foreach 控制器中调用虚拟采样器。
我添加了另一行来提取嵌套字段这是我正在使用的修改后的代码
JSONObject NameobjectInArray = objectInArray.getJSONObject("Name"); -- **I used this to get the nested fields**
字符串名字 = NameobjectInArray.optString("FirstName");
你可以考虑使用JSR223 PostProcessor and JsonSlurper组合来一次完成
- 将 JSR223 后处理器添加为 returns 以上 JSON 请求的子项
将以下代码放入"Script"区域:
new groovy.json.JsonSlurper().parse(prev.getResponseData()).data.each { entry -> new File('myfile.csv') << entry.id << ',' << entry.message << ',' << entry.created_time << ',' << entry.updated_time << System.getProperty('line.separator') }
就是这样,一旦你 运行 你的测试你将
myfile.csv
将在你 JMeter 安装的 "bin" 文件夹中生成,如下所示:1,null,2010-08-02T22:27:44+0000,2010-08-02T22:27:44+0000 2,JSON is much easier and better than XML,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000 3,null,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000 4,JSON is much easier and better than XML,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000 5,null,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000 6,JSON is much easier and better than XML,2010-08-02T25:27:44+0000,2010-08-02T25:27:44+0000