[英]How to convert a list of maps to proper JSON objects groovy/grails?
I have a result from my criteria query as such: 我从标准查询中得到了这样的结果:
[
[id:79, accountName:a99name, layoutPathId:40, layoutPath:/etc/test.txt, dataTypeId:5, dataType:demo1, vendorId:34, vendorName:v21],
[id:79, accountName:a99name, layoutPathId:41, layoutPath:/etc/test1.txt, dataTypeId:5, dataType:demo1, vendorId:34, vendorName:v21],
[id:79, accountName:a99name, layoutPathId:42, layoutPath:/etc/test3.txt, dataTypeId:6, dataType:demo2, vendorId:35, vendorName:v22]
]
Now I would like to transform this result set into as JSON structure like this: 现在,我想将此结果集转换为JSON结构,如下所示:
{
"account": {
"id": 76,
"name": "a99name",
"datatypes": [
{
"id": 5,
"name": "demo1",
"vendors": [
{
"id": 34,
"name": "v22",
"layouts": [
{
"layoutPath": "/etc/test3.txt",
"id": "42"
},
....
]
},
......
]
},
.......
]
}
}
I could use DTO but in long run I would be making a lot of DTO classes. 我可以使用DTO,但从长远来看,我会制作很多DTO类。 Is there a simpler way to achieve these kind of complex structure using java and groovy alone ?? 有没有更简单的方法可以单独使用java和groovy来实现这种复杂的结构?
So, given: 因此,鉴于:
def input = [
[id:79, accountName:'a99name', layoutPathId:40, layoutPath:'/etc/test.txt', dataTypeId:5, dataType:'demo1', vendorId:34, vendorName:'v21'],
[id:79, accountName:'a99name', layoutPathId:41, layoutPath:'/etc/test1.txt', dataTypeId:5, dataType:'demo1', vendorId:34, vendorName:'v21'],
[id:79, accountName:'a99name', layoutPathId:42, layoutPath:'/etc/test3.txt', dataTypeId:6, dataType:'demo2', vendorId:35, vendorName:'v22']
]
You could do this sort of "by hand" data manipulation: 您可以执行这种“手动”数据操作:
def munged = [ account: [
id: input.id.head(),
name: input.accountName.head(),
dataTypes: input.groupBy({it.dataTypeId}).collect { did, dataType ->
[ id: did,
name: dataType.dataType.head(),
vendors: dataType.groupBy {it.vendorId}.collect { vid, vendor ->
[ id: vid,
name: vendor.vendorName.head(),
layouts: vendor.groupBy { it.layoutPathId }.collect { lid, layout ->
[ id: lid,
layoutPath: layout.layoutPath.head()
]
}
]
}
]
}
]]
And then pass this new map through Groovy's JsonBuilder
: 然后通过Groovy的JsonBuilder
传递这个新地图:
println new groovy.json.JsonBuilder(munged).toPrettyString()
Which will print: 将打印:
{
"account": {
"id": 79,
"name": "a99name",
"dataTypes": [
{
"id": 5,
"name": "demo1",
"vendors": [
{
"id": 34,
"name": "v21",
"layouts": [
{
"id": 40,
"layoutPath": "/etc/test.txt"
},
{
"id": 41,
"layoutPath": "/etc/test1.txt"
}
]
}
]
},
{
"id": 6,
"name": "demo2",
"vendors": [
{
"id": 35,
"name": "v22",
"layouts": [
{
"id": 42,
"layoutPath": "/etc/test3.txt"
}
]
}
]
}
]
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.