我的JSON响应具有单个属性的多个值,如下所示。
{
"version": "10.2.2.48",
"systemMessages": [ {
"code": -8010,
"error": "",
"type": "error",
"module": "BROKER"
}],
"locations": [ {
"id": "10101102",
"name": "Bus Stop",
"disassembledName": "Bus",
"coord": [
3755258,
4889121
],
"type": "stop",
"matchQuality": 1000,
"isBest": true,
"modes": [
1,
5,
11
],
"parent": {
"id": "95301001|1",
"name": "Sydney",
"type": "locality"
},
"assignedStops": [ {
"id": "10101102",
"name": "Bus Stop",
"type": "stop",
"coord": [
3755258,
4889121
],
"parent": {
"name": "Sydney",
"type": "locality"
},
"modes": [
1,
5,
11
],
"connectingMode": 100
}]
}]
}
观察“模式”有3个值。如果我尝试通过JsonSlurper脚本断言提取模式的值,它将值赋予[1,5,11]并计为只有1.我想将它们分成3个数组元素或变量,需要计数为3。什么是可能的脚本断言代码?
断言:
import groovy.json.JsonSlurper
def resp = messageExchange.response.responseContent;
def jsl = new JsonSlurper().parseText(resp);
def modes = jsl.locations.modes
log.info modes
log.info modes.size()
结果:
Wed Feb 13 10:50:49 AEDT 2019:INFO:[[1, 5, 11]]
Wed Feb 13 10:50:49 AEDT 2019:INFO:1
你在这个例子中处理的是Groovy's spread operator的简写版本,你的代码返回一个有效的结果。当您调用jsl.locations
时,您实际上访问了所有位置对象的列表(示例中的单例列表)。你打电话时
jsl.locations.modes
你使用的速记版本
jsl.locations*.modes
这相当于以下代码:
jsl.locations.collect { it.modes }
此代码表示:迭代locations
并将位置列表转换为这些位置的模式列表列表 - [[1,5,11]]
。
应用正确的解决方案取决于更多因素。例如,您需要考虑包含多个位置的locations
列表 - 在这种情况下,转换jsl.locations.modes
可能会产生类似[[1,5,11],[1,5,11],[2,4,9]]
的结果 - 3个模式列表的列表。
如果您假设总是返回一个位置,那么您可以简单地展平最终列表,如:
def modes = jsl.locations.modes.flatten()
assert modes == [1,5,11]
assert modes.size() == 3
但是,如果locations
包含另一个JSON对象,让我们说,使用完全相同的模式,那么它将产生完全不同的结果:
def modes = jsl.locations.modes.flatten()
assert modes == [1,5,11,1,5,11]
assert modes.size() == 6
在这种情况下,最好使用如下的断言:
def modes = jsl.locations.modes
assert modes == [[1,5,11],[1,5,11]]
assert modes*.size() == [3,3]
意思是:
modes
商店2列出[1,5,11]
和[1,5,11]
,