Маршалинг с использованием спрея json лучший случай для карты карт - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть следующие строки класса дел, которые я хочу отфильтровать и представить их как 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. Как вы можете сделать маршалинг объекта Карта Карты, используя брызги - json, я не могу это убрать?

  2. Теперь, если мы видим, что typeId на самом деле является UUID, и мне нужно сделать еще один вызов базы данных, чтобы найти typeName, каков наилучший способ заполнить его и создать пользовательский объект json, который я хочу создать?

  3. Я не могу использовать метод groupMapReduce, так как мы используем версию 2.12 scala, и я не могу выполнить обновление по другим причинам. Любая альтернатива группировке по typeName

1 Ответ

0 голосов
/ 08 апреля 2020

Мои предложения:

  1. Используйте circe вместо спрей- json. Он имеет функцию автоматического вывода, которая помогает вам go быстро без какого-либо пользовательского / ручного кодировщика, например:
  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))

...