json - 如何在 Scala 中执行嵌套的 groupBy

标签 json scala collections group-by nested

我有一个像这样的案例对象列表:

AppInfo(client = "client1", project = "project1", version = "version1")
AppInfo(client = "client1", project = "project1", version = "version2")
AppInfo(client = "client2", project = "project3", version = "version1")
AppInfo(client = "client2", project = "project4", version = "version1")

并且需要制作这样的嵌套结构:
Map(
  "clients" -> List(
    Map(
      "name" -> "client1",
      "projects" -> List(
        Map(
          "name" -> "project1",
          "versions" -> List(
            "version1",
            "version2"
          )
        )
      )
    ),
    Map(
      "name" -> "client2",
      "projects" -> List(
        Map(
          "name" -> "project3",
          "versions" -> List(
            "version1"
          )
        ),
        Map(
          "name" -> "project4",
          "versions" -> List(
            "version1"
          )
        )
      )
    )
  )
)

这看起来很糟糕,但它会序列化为这个非常简单的 JSON:
{
  "clients": [
    {
      "name": "client1",
      "projects": [
        {
          "name": "project1",
          "versions": [
            "version1",
            "version2"
          ]
        }
      ]
    },
    {
      "name": "client2",
      "projects": [
        {
          "name": "project3",
          "versions": [
            "version1"
          ]
        },
        {
          "name": "project4",
          "versions": [
            "version1"
          ]
        }
      ]
    }
  ]
}

有什么合理的方法可以做到这一点吗?现在我在列表中的 groupBys 中的 Maps 中有 map 。

编辑

类似于 Specter Clojure 库可能会有所帮助。

最佳答案

怎么样:

for {
    (clientName, clientInfos) <- infoList.groupBy(_.client)
} yield {
    val clientProjects = clientInfos.groupBy(_.project)
    val projectSection = clientProjects.map { case(name, infos) => Map("name" -> name, "versions" -> infos.map(_.version)) }

    Map("name" -> clientName, "projects" -> projectSection)
}

它不会减少 map 的数量或 groupBy调用,但这是我能够组织代码的最方便的方式。

关于json - 如何在 Scala 中执行嵌套的 groupBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35185856/

相关文章:

javascript - 在 JavaScript 函数中获取 Json 数组值

php - FullCalendar 不显示来自 JSON 事件的时间

scala - 卡夫卡流0.10.1 "Failed to flush state store"

java - 如何让 Jxls 生成多个集合

java - Java List of()静态方法

php - 如何从 PHP 返回 JSON 对象以从 Android 应用程序中读取

c# - 使用 JsonTextReader 值作为新流传递 Base64 编码的字符串

scala - 如何将简单的名称带入范围?

java - 如何将 eclipse 中的 scala 项目中的文件包含到 netbeans 中的 java 项目中

c# - 在 C# 中使用反射添加到未知类型的集合