Scala - конвертировать список карт в карту - PullRequest
0 голосов
/ 26 марта 2020

У меня есть строка JSON, которую нужно обработать, и я отображаю ее следующим образом:

val jsonMap = mapper.readValue[Map[String, Object]](jsonString)

My jsonMap содержит следующее значение:

Map(k1 -> List(Map(k2 -> v2), Map(k3 -> v3))

Требуемое значение для newJsonMap:

 Map(k1 -> Map(k2 -> v2))

Итак, в двух словах, я хочу преобразовать значение ключа k1 из List в Map. Сначала я начал реализовывать в соответствии с этим вопросом: Scala - Свести список карт на карту

Но потом я понял, что имею дело с разными типами данных, в данном случае Map[String, Object] это означает, что я не могу выполнять такие операции, как использование встроенного метода scala flatten для списков.

Можно ли как-нибудь преобразовать эту Карту в Scala Карту, чтобы я мог применить необходимые преобразования к JSON? Есть мысли о том, как мне поступить?

Заранее спасибо.

1 Ответ

1 голос
/ 26 марта 2020

Простой ответ - сделать это

val jsonMap = mapper.readValue[Map[String, List[Map[String, String]]]](jsonString)

и затем использовать ответ из предыдущего вопроса.

Если вы хотите сделать это вручную, что-то вроде этого должно работать:

val map: Map[String, Map[String, String]] =
  jsonMap.collect {
    case (k, v: List[_]) =>
      val list: List[Map[String, String]] =
        v.collect {
          case m: Map[_, _] =>
            m.collect {
              case (k: String, v: String) =>
                k -> v
            }
        }
      k -> list.headOption.getOrElse(Map.empty)
  }

При этом будут игнорироваться любые элементы в Object, которые не являются обязательными. Вложенные collect выражения необходимы, потому что стирание типа предотвращает сопоставление вложенного типа в одной операции.

Это предполагает, что вы хотите head из List[Map] внутри Object, но это должно быть понятным, как изменить это на другое преобразование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...