2015-10-05 35 views
0

我有一個結果,從我的標準查詢作爲這樣的:
如何將地圖列表轉換爲適當的JSON對象groovy/grails?

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


現在我想改變這個結果集到的JSON的結構是這樣的:

{ 
    "account": { 
     "id": 76, 
     "name": "a99name", 
     "datatypes": [ 
      { 
       "id": 5, 
       "name": "demo1", 
       "vendors": [ 
        { 
         "id": 34, 
         "name": "v22", 
         "layouts": [ 
          { 
           "layoutPath": "/etc/test3.txt", 
           "id": "42" 
          }, 
          .... 
         ] 
        }, 
        ...... 
       ] 
      }, 
     ....... 
     ] 
    } 
} 

我可以使用DTO但從長遠來看,我會做很多DTO課程。 有沒有一種更簡單的方法來實現這種使用java和groovy單獨的複雜結構?

回答

2

因此,考慮到:

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'] 
] 

你可以 「手動」 數據操作做這樣的:

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() 
        ] 
       } 
       ] 
      } 
     ] 
    } 
]] 

然後通過Groovy的JsonBuilder這個新地圖:

println new groovy.json.JsonBuilder(munged).toPrettyString() 

將打印的內容:

{ 
    "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" 
          } 
         ] 
        } 
       ] 
      } 
     ] 
    } 
}