首页 > 解决方案 > Scala - 将地图列表转换为地图

问题描述

我有一个我需要处理的 JSON 字符串,我正在以下列方式映射它:

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

MyjsonMap包含以下值:

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

所需的值为newJsonMap

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

所以简而言之,我想将k1键的值从 a转换List为 a Map。我首先根据这个问题开始实现:Scala - Flatten a List of Maps to Map

但后来我意识到我正在处理不同的数据类型,在这种情况下Map[String, Object],这意味着我无法执行诸如使用 scala 内置flatten方法来列表的操作。

有什么方法可以将此 Map 转换为 Scala Map,以便将必要的转换应用于 JSON?关于我应该如何进行的任何想法?

提前致谢。

标签: scala

解决方案


简单的答案是这样做

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


推荐阅读