scala - 使用喷雾 json 对地图进行封送处理的最佳案例
问题描述
我有以下案例类行,我想进一步过滤并将它们表示为 json
case class Row(id: UUID, ownerId: UUID, typeId: UUID, name: String, value: String)
我要表示的json格式
{
"owner": "ownerId",
"configurations": {
"typeId1": {
"name1": "value1",
"name2": "value2"
},
"typeId2": {
"name3": "value3",
"name4": "value4"
}
}
}
现在我将其转换为以下结果类型
case class Data(owner: String, configurations: Map[String, Map[String, String]])
我正在使用以下功能执行上述操作
def convert(rows: Seq[Row]): Data =
Data(owner = <SomedatabaseCall to populate this>,
configurations = rows.groupMapReduce(_.typeId/*Actually need to populate this with a database call as well*/)(r => Map(r.name -> r.value))(_ ++ _))
我在这里有三个问题:
如何使用 spray-json 编组 Map of Maps 的 Map 对象,我无法清除它?
现在如果我们看到
typeId
它实际上是一个 UUID 并且我需要进行另一个数据库调用来找到它typeName
,那么填充它并制作我想要创建的自定义 json 对象的最佳方法是什么?我无法使用该
groupMapReduce
方法,因为我们使用的是 2.12 版本的 scala,并且由于其他原因我无法升级。分组的任何替代方案typeName
解决方案
我的建议:
- 使用
circe
而不是 spray-json。它具有自动推导功能,无需任何自定义/手动编码器解码器即可帮助您快速运行:
import io.circe.generic.auto._, io.circe.syntax._
case class Data(owner: String, configurations: Map[String, Map[String, String]])
val data = Data("abc", Map("key1" -> Map("kkey1" -> "value1"), "key2" -> Map("kkey2" -> "value2"), "key3" -> Map("kkey2" -> "value1")))
println(s"JSON:${data.asJson.toString()}")
- 没有足够的信息让我清楚地回答
- 分组。是的,有替代版本:
x.groupBy(key).mapValues(_.map(f).reduce(reduce))
推荐阅读
- c - 错误的输出 ASCII 到最接近的素数
- javascript - 使数据表列在按钮单击时调整大小
- jsf - OmniFaces FullAjaxExceptionHandler 日志记录专业化
- docker - 根据容器id查找docker文件路径
- c++ - 在类模板参数上调用模板方法
- javascript - 为什么浏览器不能直接执行js
- r - 在 RShiny 中重置滑块
- php - html中的php isset
- ejb - 使用 glassfish 5、JEE 8 和独立应用程序进行 JAAS 登录
- google-cloud-dataflow - Dataflow 中的 --streaming 选项有什么作用?