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 - 将地图列表转换为地图的主要内容,如果未能解决你的问题,请参考以下文章