Scala-将地图列表转换为地图
我需要处理一个JSON字符串,并以以下方式映射它:Scala-将地图列表转换为地图,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键的值从List转换为Map。我首先根据这个问题开始实施
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
键的值从List
转换为Map
。我首先根据这个问题开始实施:
但后来我意识到我处理的是不同的数据类型,在本例中,Map[String,Object]
,这意味着我无法执行诸如使用scala内置的flatte
方法对列表执行的操作
是否有任何方法可以将此映射转换为Scala映射,以便对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)
}
这将忽略对象
中非必需类型的任何元素。嵌套的collect
表达式是必需的,因为类型擦除会阻止在一次操作中匹配嵌套类型
这是假设您希望
列表[Map]
的头位于对象
内,但应该清楚如何将其更改为不同的转换。您使用的是哪个json库?您必须使用该库,还是可以选择其他选项?输出的类型应该是什么?你能给我们举个例子吗?你确定要地图吗?您知道您正在解析的格式吗?如果知道,为什么不定义一些正确表示您的模型的case类并将您的json解析成这种格式呢?@LuisMiguelMejíaSuárez,首先感谢您的帮助。我正在使用jackson模块将JSON读入一个映射[字符串,对象]。主要目标是将json列表转换为json元素(即,将“[]”替换为“{}”)。示例:json={k1=[k2={…}]}到{k1={k2={…}}}。在这种特殊情况下,因为我只需要对预期的特定情况进行转换,所以我找到的解决方案适合这个问题。谢谢:)谢谢你的回答!虽然我没有用它,但是你的功能帮助我理解了这个问题!