【问题标题】:Scala - Convert a List of Maps to a MapScala - 将地图列表转换为地图
【发布时间】: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 = { ... } ..} .. }。在这种特殊情况下,由于我只需要针对预期的特定情况进行此转换,因此我找到的解决方案适合该问题。谢谢:)

标签: scala


【解决方案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 中,但应该清楚如何将其更改为不同的转换。

【讨论】:

  • 感谢您的回答!虽然我没有使用它,但是你的功能帮助我理解了这个问题!
猜你喜欢
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 2011-11-01
相关资源
最近更新 更多