获取 Scala 映射的嵌套字段



我有以下地图对象:

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:"位置"不存在,"位置"不是地图,"位置"地图不包含"经度"等。

最新更新