我有一个包含地图列表的JSON:
{
"aprLimits": [{
"orgId": "Company 1",
"rangeStart": "54936",
"rangeEnd": "54936",
"amountLimit": 100000
}, {
"orgId": "Company 1",
"rangeStart": "59434",
"rangeEnd": "59434",
"amountLimit": 0.01
}, {
"orgId": "Company 1",
"rangeStart": "54345",
"rangeEnd": "54345",
"amountLimit": 0
}, {
"orgId": "Company 1",
"rangeStart": "54345",
"rangeEnd": "54345",
"amountLimit": 250000
}, {
"orgId": "Company 2",
"rangeStart": "043",
"rangeEnd": "043",
"amountLimit": 0.01
}, {
"orgId": "Company 2",
"rangeStart": "042",
"rangeEnd": "042",
"amountLimit": 1000
}, {
"orgId": "Company 2",
"rangeStart": "032",
"rangeEnd": "032",
"amountLimit": 0
}]}
我的目标是通过将唯一的orgId转换为键并为其分配其余值来收集与唯一orgId相对应的数据,以便最终结果如下所示:
["Company 1": [[54936, 54936, 100000], [59434, 59434, 0.01], [54345, 54345, 0], [54345, 54345, 250000]], "Company 2": [[043, 043, 0.01], [042, 042, 1000], [032, 032, 0]]]
我已经获得了唯一的orgId并将数据收集到列表中,但是我很难弄清楚如何将唯一键与列表相关联
def slurper = new JsonSlurper()
def parsedJson = slurper.parseText(json)
def list = []
def orgIds = parsedJson.aprLimits.orgId.unique()
parsedJson.aprLimits.each {
if (orgIds.contains(it.orgId)) {
data = new ArrayList(Arrays.asList(it.rangeStart, it.rangeEnd, it.amountLimit))
list.add(data)
}}
答案 0 :(得分:2)
这里最好的起点是groupBy
,然后调整所需的数据。更简短的是 reduce (带有映射的默认值)。例如
parsedJson.aprLimits.inject(
[:].withDefault{[]} // if a key is missing, add it and make the value an empty vector
){ r, v ->
r[v.orgId] << [v.rangeStart, v.rangeEnd, v.amountLimit]
r
}