我有以下地图对象:
val ad = node.asInstanceOf[Map[String, Any]]
广告对象的打印示例是:
ListMap(userId -> 1234, userName -> Jason, location -> ListMap(longitude -> -79.234264, latitude -> 37.2395), email -> Some(jason@yahoo.com))
我正在尝试访问位置字段的嵌套字段并将其转换为双精度。我有以下几点:
ad.get("location") match {
case Some(i) => i match {
case j: Map[Any, Any] => j("longitude").asInstanceOf[Double]
}
我的问题是还有另一种更优雅/更干净的语法方法来获取位置字段的嵌套对象吗?
这取决于"优雅/干净"的概念,因为这种数据结构闻起来并不好。
无论如何,内部模式匹配可以与外部模式匹配合并,如下所示:
ad.get("location") match {
case Some(i: Map[Any,Any]) => i("longitude").asInstanceOf[Double]
case _ => // do nothing
}
你真的不能用像Map[String, Any]
这样的类型做任何优雅的事情。我会考虑首先使用一个更类型安全的 Json 库,比如 Circe。
否则,这取决于您对Map
的静态了解。如果你确定Map
中存在"位置",并且它总是包含一个带有"经度"键的嵌套Map
,并且"经度"确实总是一个Double
,那么返回一个Double
是可以的。否则,您应该考虑返回Option[Double]
或类似Either[String, Double]
.例如:
ad.get("location").flatMap {
case location: Map[String, _] => Try(location("longitude").asInstanceOf[Double]).toOption
case _ => None
}
如果由于某种原因无法获得所需的值,这将返回一个None
:"位置"不存在,"位置"不是地图,"位置"地图不包含"经度"等。