首页 > 解决方案 > 如何在 Groovy 中的列表中嵌套列表

问题描述

这是我原来的 json

[
  {
    "city": "houston",
    "countyName": "county1",
    "email": "county1@gmail.com"
  },
  {
    "city": "houston",
    "countyName": "county1",
    "email": "county1a@gmail.com"
  },
  {
    "city": "houston",
    "countyName": "county2",
    "email": "county2@gmail.com"
  },
  {
    "city": "dallas",
    "countyName": "county1",
    "email": "countyDallas1@gmail.com"
  },
  {
    "city": "dallas",
    "countyName": "county2",
    "email": "countyDallas2@gmail.com"
  }
]

我想转换成:

[
  {
    "city": "houston",
    "counties": [
      {
        "countyName": "county1",
        "email": [
          "county1@gmail.com",
          "county1a@gmail.com"
        ]
      },
      {
        "countyName": "county2",
        "email": [
          "county2@gmail.com"
        ]
      }
    ]
  },
  {
    "city": "dallas",
    "counties": [
      {
        "countyName": "county1",
        "email": [
          "county1@gmail.com"
        ]
      },
      {
        "countyName": "county2",
        "email": [
          "county2@gmail.com"
        ]
      }
    ]
  }
]  

我做了如下

groupBy{it.countyName}.values().collect{m-> [city: m.city[0], counties: m.counties.unique())]}  

到目前为止,我按县名分组。
在那之后,我得到了价值观。
然后我收集到新列表。
我可以获得一个唯一的县列表,但我不知道如何按预期结果嵌套

groupBy{it.countyName}.values().collect{m-> [city: m.city[0], counties: m.counties.unique())]}  

哪个命令用于将电子邮件列表嵌套在县列表中

标签: groovynestediteration

解决方案


您应该首先按城市名称对输入列表进行分组。然后对于每个城市,您可以按县名对剩余数据进行分组,以收集电子邮件地址列表。考虑以下示例:

import groovy.json.JsonOutput
import groovy.json.JsonSlurper

def json = '''[
  {
    "city": "houston",
    "countyName": "county1",
    "email": "county1@gmail.com"
  },
  {
    "city": "houston",
    "countyName": "county1",
    "email": "county1a@gmail.com"
  },
  {
    "city": "houston",
    "countyName": "county2",
    "email": "county2@gmail.com"
  },
  {
    "city": "dallas",
    "countyName": "county1",
    "email": "countyDallas1@gmail.com"
  },
  {
    "city": "dallas",
    "countyName": "county2",
    "email": "countyDallas2@gmail.com"
  }
]'''

List list = new JsonSlurper().parseText(json)

def result = list.groupBy { it.city }.collect { cityName, cityData ->

    def counties = cityData.groupBy { it.countyName }.collect { countyName, countyData ->
        [countyName: countyName, email: countyData.collect { it.email }]
    }

    return [city: cityName, counties: counties]
}


println JsonOutput.prettyPrint(JsonOutput.toJson(result))

输出:

[
    {
        "city": "houston",
        "counties": [
            {
                "countyName": "county1",
                "email": [
                    "county1@gmail.com",
                    "county1a@gmail.com"
                ]
            },
            {
                "countyName": "county2",
                "email": [
                    "county2@gmail.com"
                ]
            }
        ]
    },
    {
        "city": "dallas",
        "counties": [
            {
                "countyName": "county1",
                "email": [
                    "countyDallas1@gmail.com"
                ]
            },
            {
                "countyName": "county2",
                "email": [
                    "countyDallas2@gmail.com"
                ]
            }
        ]
    }
]

推荐阅读