我有一个需要处理的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应用必要的转换?关于我应该如何进行的任何想法?
谢谢。
答案 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'
});
中,但是应该清楚如何将其更改为其他转换。