gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:35:39 28 4
gpt4 key购买 nike

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

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com