Reputation: 23
I would like to nest a map where I group by common values and show the remaining values as a nested map. For example, if I have the following map:
[
[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]
]
I would like to end with a map like this, to later convert to 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]]]
]
I tried to use groupBy and collect, but I end up with something like this:
[
[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]]]
]
Thank you
Upvotes: 2
Views: 85
Reputation: 20699
Something like the one-liner:
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 )
Note, that JsonOutput is only for pretty formatting here.
The code above prints:
[
{
"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"
}
]
}
]
Upvotes: 2