首页 > 解决方案 > 使用喷雾 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))(_ ++ _))

我在这里有三个问题:

  1. 如何使用 spray-json 编组 Map of Maps 的 Map 对象,我无法清除它?

  2. 现在如果我们看到typeId它实际上是一个 UUID 并且我需要进行另一个数据库调用来找到它typeName,那么填充它并制作我想要创建的自定义 json 对象的最佳方法是什么?

  3. 我无法使用该groupMapReduce方法,因为我们使用的是 2.12 版本的 scala,并且由于其他原因我无法升级。分组的任何替代方案typeName

标签: scalasprayspray-json

解决方案


我的建议:

  1. 使用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()}")


  1. 没有足够的信息让我清楚地回答
  2. 分组。是的,有替代版本:
x.groupBy(key).mapValues(_.map(f).reduce(reduce))


推荐阅读