【发布时间】:2017-10-16 21:53:20
【问题描述】:
您将如何进行模式匹配以从列表中包含的地图中提取值?
所以我的数据是List[Map[String,Any]] 类型,看起来像:
List(Map(sequence -> 192, id -> 8697413670252052, type -> List(AimLowEvent, DiscreteEvent), time -> 527638582195))
List(Map(duration -> 143858743, id -> 8702168014834892, sequence -> 195, sessionId -> 8697344444103393, time -> 527780267698, type -> List(SessionCanceled, SessionEnded)), Map(trackingInfo -> Map(trackId -> 14170286, location -> Browse, listId -> cd7c2c7a-00f6-4035-867f-d1dd7d89972d_6625365X3XX1505943605585, videoId -> 80000778, rank -> 0, row -> 0, requestId -> ac12f4e1-5644-46af-87d1-ec3b92ce4896-4071171), id -> 8697344444103393, sequence -> 89, time -> 527636408955, type -> List(Play, Action, Session)), 1)
List(Map(duration -> 142862569, id -> 8702168403395215, sequence -> 201, sessionId -> 8697374208897843, time -> 527780267698, type -> List(SessionCanceled, SessionEnded)), Map(trackingInfo -> Map(trackId -> 14170286, location -> Browse, listId -> cd7c2c7a-00f6-4035-867f-d1dd7d89972d_6625365X3XX1505943605585, videoId -> 80000778, rank -> 0, row -> 0, requestId -> ac12f4e1-5644-46af-87d1-ec3b92ce4896-4071171), id -> 8697374208897843, sequence -> 136, time -> 527637405129, type -> List(Play, Action, Session)), 1)
首先,我只想保留包含Map(trackingInfo -> .. 的记录,因为对我很重要的字段在这些记录中,例如trackId。但是在这些相同的记录中,我还需要外部字段,例如 sequence
我已经厌倦了将列表扁平化为 Map by,所以我可以在地图上进行匹配:
myList.flatten.toMap
但是它返回 java.lang.ClassCastException: scala.collection.immutable.Map$Map4 cannot be cast to scala.Tuple2 错误。
感谢任何帮助
【问题讨论】:
-
您不应该从您显示的代码中获得此异常(或对 Stefano 的回答发表评论的异常)。真正的原因可能是在其他地方错误地使用了
asInstanceOf或isInstanceOf。 -
@AlexeyRomanov 是的,我确实使用
asInstanceOf[List[Map[String,Any]]来获得上述结构。原始数据是嵌套的json。 -
@AlexeyRomanov 我认为你是对的,所以我开始以不同的方式处理这个问题。如果您对这里感兴趣是我关于解析原始 json stackoverflow.com/questions/46787888/… 的问题