Gatling:来自 Json 对地图对象的响应的地图字段
Gatling: Map fields from Json Response to a Map Object
我的回复是这样的
{
"data":[
{
"id":"919274ee42fe01d40f89f51239009a2b",
"descriptor":"Long Count_copy_1938",
"alias":"longCount_Copy_1938",
"type":"Numeric"
},
{
"id":"435274ee42fe01d40f89f51239009a2b",
"descriptor":"Long Count2",
"alias":"longCount_Copy2",
"type":"Numeric"
},
{
"id":"345274ee42fe01d40f89f51239009a2b",
"descriptor":"Short Count2",
"alias":"Short count",
"type":"Numeric"
}
]
}
我想将 "descriptor":"id" 提取到地图中。映射后,Map对象应该是这样的
"Long Count_copy_1938" -> "919274ee42fe01d40f89f51239009a2b"
"Long Count2" -> "435274ee42fe01d40f89f51239009a2b"
"Short Count2" -> "345274ee42fe01d40f89f51239009a2b"
我是这样实现的,如果有更好的方法请告诉我。谢谢!
exec(http("Get Field ids")
.get(s"${wqlDataSources}/")
.check(status.is(200),
jsonPath("$.data[*].descriptor").findAll.saveAs("descriptors"),
jsonPath("$.data[*].id").findAll.saveAs("ids")))
.exec(session => {
val descriptors = session("descriptors").as[Vector[String]]
val ids = session("ids").as[Vector[String]]
val fieldIdMap = (descriptors zip ids).toMap
session.set("fieldIdResultMap", fieldIdMap)
session.remove("descriptors").remove("ids")
})
大多数 JSONPath 实现支持使用 [,]
联合运算符一次提取多个值,例如$..['id','descriptor']
以匹配您的两个属性。
(但是,联合的可用性和结果既不通用也不一致,如果你通过切换到 Goessner 或 Jayway 检查上面的路径 online here 你会发现结果不一样,测试站点上的 Gattling 选项卡甚至会引发错误;我无法判断该站点是否会使用最新版本。)
我找不到任何确认 Gatling 支持联合的文档,但我在 Gatling 的 Github 存储库中发现 this test 有一个联合:JsonPath.query("$.menu['file','year']", json) ...
所以,联合应该工作,一般来说.
经过反复试验,我发现这条路径可以使用 Gatling(即使是旧版本):
$.data[*]['id','descriptor']
哪个returns:
[
"919274ee42fe01d40f89f51239009a2b",
"Long Count_copy_1938",
"435274ee42fe01d40f89f51239009a2b",
"Long Count2",
"345274ee42fe01d40f89f51239009a2b",
"Short Count2"
]
因此,您应该能够使用此路径一次映射 key/value 对!
这里还有 1 个有效的解决方案,
exec(http("Get Field ids for the data source")
.get(s"${wqlDataSources}/" + "${datasourceId}/fields)
.check(status.is(200),
jsonPath("$.data[*].descriptor").findAll.saveAs("descriptors"),
jsonPath("$.data[*].id").findAll.saveAs("ids")))
.exec(session => {
val descriptors = session("descriptors").as[Vector[String]]
val ids = session("ids").as[Vector[String]]
val currentFieldIdMap = (descriptors zip ids).toMap
})
我的回复是这样的
{
"data":[
{
"id":"919274ee42fe01d40f89f51239009a2b",
"descriptor":"Long Count_copy_1938",
"alias":"longCount_Copy_1938",
"type":"Numeric"
},
{
"id":"435274ee42fe01d40f89f51239009a2b",
"descriptor":"Long Count2",
"alias":"longCount_Copy2",
"type":"Numeric"
},
{
"id":"345274ee42fe01d40f89f51239009a2b",
"descriptor":"Short Count2",
"alias":"Short count",
"type":"Numeric"
}
]
}
我想将 "descriptor":"id" 提取到地图中。映射后,Map对象应该是这样的
"Long Count_copy_1938" -> "919274ee42fe01d40f89f51239009a2b"
"Long Count2" -> "435274ee42fe01d40f89f51239009a2b"
"Short Count2" -> "345274ee42fe01d40f89f51239009a2b"
我是这样实现的,如果有更好的方法请告诉我。谢谢!
exec(http("Get Field ids")
.get(s"${wqlDataSources}/")
.check(status.is(200),
jsonPath("$.data[*].descriptor").findAll.saveAs("descriptors"),
jsonPath("$.data[*].id").findAll.saveAs("ids")))
.exec(session => {
val descriptors = session("descriptors").as[Vector[String]]
val ids = session("ids").as[Vector[String]]
val fieldIdMap = (descriptors zip ids).toMap
session.set("fieldIdResultMap", fieldIdMap)
session.remove("descriptors").remove("ids")
})
大多数 JSONPath 实现支持使用 [,]
联合运算符一次提取多个值,例如$..['id','descriptor']
以匹配您的两个属性。
(但是,联合的可用性和结果既不通用也不一致,如果你通过切换到 Goessner 或 Jayway 检查上面的路径 online here 你会发现结果不一样,测试站点上的 Gattling 选项卡甚至会引发错误;我无法判断该站点是否会使用最新版本。)
我找不到任何确认 Gatling 支持联合的文档,但我在 Gatling 的 Github 存储库中发现 this test 有一个联合:JsonPath.query("$.menu['file','year']", json) ...
所以,联合应该工作,一般来说.
经过反复试验,我发现这条路径可以使用 Gatling(即使是旧版本):
$.data[*]['id','descriptor']
哪个returns:
[ "919274ee42fe01d40f89f51239009a2b", "Long Count_copy_1938", "435274ee42fe01d40f89f51239009a2b", "Long Count2", "345274ee42fe01d40f89f51239009a2b", "Short Count2" ]
因此,您应该能够使用此路径一次映射 key/value 对!
这里还有 1 个有效的解决方案,
exec(http("Get Field ids for the data source")
.get(s"${wqlDataSources}/" + "${datasourceId}/fields)
.check(status.is(200),
jsonPath("$.data[*].descriptor").findAll.saveAs("descriptors"),
jsonPath("$.data[*].id").findAll.saveAs("ids")))
.exec(session => {
val descriptors = session("descriptors").as[Vector[String]]
val ids = session("ids").as[Vector[String]]
val currentFieldIdMap = (descriptors zip ids).toMap
})