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

时间:2020-03-26 02:21:20

标签: scala

我有一个需要处理的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应用必要的转换?关于我应该如何进行的任何想法?

谢谢。

1 个答案:

答案 0 :(得分: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表达式是必需的,因为类型擦除会阻止一次操作中嵌套类型的匹配。

这是假设您希望将head中的List[Map]中的Object放在AssistantGroupModel.belongsTo(StaffGroup, { sourceKey: 'id', foreignKey: 'staff_group_id', as: 'staff_group' }); 中,但是应该清楚如何将其更改为其他转换。