我想嵌套一个映射,其中按公共值分组,并将其余值显示为嵌套映射。例如,如果我有以下映射:
[
[user:andy, name:Andrew, role:dev, roleDesc:Developer],
[user:andy, name:Andrew, role:sup, roleDesc:Supervisor],
[user:pat, name:Patricia, role:man, roleDesc:Manager],
[user:pat, name:Patricia, role:sup, roleDesc:Supervisor]
]
我想以这样的映射结束,稍后转换为JSON:
[
[user:andy, name:Andrew, roles:[[role:dev, roleDesc:Developer], [role:sup, roleDesc:Supervisor]]],
[user:pat, name:Patricia, roles:[[role:man, roleDesc:Manager], [role:sup, roleDesc:Supervisor]]]
]
我尝试使用groupBy和collect,但我最终得到这样的东西:
[
[user:andy, name:Andrew, roles:[[role:dev, role:sup], [roleDesc:Developer, roleDesc:Supervisor]]],
[user:pat, name:Patricia, roles:[[role:man, role:sup], [roleDesc:Manager, roleDesc:Supervisor]]]
]
谢谢
类似一行代码:
import groovy.json.JsonOutput
def data = [
[user:'andy', name:'Andrew', role:'dev', roleDesc:'Developer'],
[user:'andy', name:'Andrew', role:'sup', roleDesc:'Supervisor'],
[user:'pat', name:'Patricia', role:'man', roleDesc:'Manager'],
[user:'pat', name:'Patricia', role:'sup', roleDesc:'Supervisor']
]
def res = data.groupBy{ [ user:it.user, name:it.name ] }.collect{ group, values -> group + [ roles:values.collect{ [ role:it.role, roleDesc:it.roleDesc ] } ] }
JsonOutput.prettyPrint JsonOutput.toJson( res )
注意,JsonOutput在这里只用于美观的格式化。
上面的代码输出:
[
{
"user": "andy",
"name": "Andrew",
"roles": [
{
"role": "dev",
"roleDesc": "Developer"
},
{
"role": "sup",
"roleDesc": "Supervisor"
}
]
},
{
"user": "pat",
"name": "Patricia",
"roles": [
{
"role": "man",
"roleDesc": "Manager"
},
{
"role": "sup",
"roleDesc": "Supervisor"
}
]
}
]