scala - 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?关于我应该如何进行的任何想法?
提前致谢。
解决方案
简单的答案是这样做
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
推荐阅读
- machine-learning - 低 RAM 环境中 Fasttex 的 OOV(词汇表外)词嵌入
- javascript - D3 图节点上的搜索功能
- wordpress - 如何在 wordpress 中将archive.php 中的标签显示为下拉菜单?
- spring - 使用基本身份验证获取 OAuth 令牌
- scala - 如何在 flink 中统一度量指标
- javascript - 绑定时特殊字符后的AngularJs换行
- android - 如何阻止 Android WebView 更改标头的大小写?
- android - 如何将 Activity 对象传递给 onBindViewHolder 方法以在 getScaledBitmap 方法中使用该对象
- c++ - 使用较新的 boost 库和使用旧版本的预编译二进制文件
- php - 无法从数据库中获取 int 并使用它 PHP