Scala - 将地图列表转换为地图

Posted

技术标签:

【中文标题】Scala - 将地图列表转换为地图【英文标题】:Scala - Convert a List of Maps to a Map 【发布时间】:2020-07-06 15:58:47 【问题描述】:

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

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

我的jsonMap 包含以下值:

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

newJsonMap 的期望值为:

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

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

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

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

提前致谢。

【问题讨论】:

您使用的是哪个 json 库?您必须使用该库还是愿意接受其他选择?输出的类型应该是什么?你能给我们一个例子json吗?吃了你确定要地图的地图吗?你知道你正在解析的格式吗?如果知道,为什么不定义一些正确表示你的模型的案例类并将你的 json 解析成那个? @LuisMiguelMejíaSuárez,首先感谢您的帮助。我正在使用杰克逊模块将 JSON 读入 Map[String, Object]。主要目标是将 json 列表转换为 json 元素(即,将“[ ]”替换为“ ”)。示例:json = k1 = [ k2 = ... .. ] .. 转换为 k1 = k2 = ... .. .. 。在这种特殊情况下,由于我只需要针对预期的特定情况进行此转换,因此我找到的解决方案适合该问题。谢谢:) 【参考方案1】:

简单的答案就是这样做

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 表达式,因为类型擦除会阻止在一次操作中匹配嵌套类型。

这是假设您希望List[Map] 中的head 包含在Object 中,但应该清楚如何将其更改为不同的转换。

【讨论】:

感谢您的回答!虽然我没有使用它,但是你的功能帮助我理解了这个问题!

以上是关于Scala - 将地图列表转换为地图的主要内容,如果未能解决你的问题,请参考以下文章

Scala - 将 RDD[String] 转换为地图

使用 Scala 将多列转换为 Spark Dataframe 上的一列地图

Python:将地图对象转换为列表会使地图对象为空?

将 Java 映射转换为 Scala 映射

如何将地图数据转换为颤动中的对象列表?

使用 foldLeft 将列表转换为地图