简体   繁体   English

如何将地图列表转换为常规的groovy / grails对象?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM