2017-08-23 91 views
0

我有以下地图对象:得到斯卡拉地图的嵌套领域

val ad = node.asInstanceOf[Map[String, Any]] 

和广告对象的印刷例子是:

ListMap(userId -> 1234, userName -> Jason, location -> ListMap(longitude -> -79.234264, latitude -> 37.2395), email -> Some([email protected])) 

我试图访问该位置的嵌套字段字段并将其转换为双精度。我有以下几点:

ad.get("location") match { 
      case Some(i) => i match { 
      case j: Map[Any, Any] => j("longitude").asInstanceOf[Double] 
      } 

我的问题是有另一种更优雅/更清晰的语法方式来获得位置字段的嵌套的对象?

回答

1

它依赖于“优雅/清洁剂”的概念,因为那样的数据结构并不好闻。

无论如何,内模式匹配可以与外部一个被合并,就像这样:

ad.get("location") match { 
    case Some(i: Map[Any,Any]) => i("longitude").asInstanceOf[Double] 
    case _ => // do nothing 
} 
0

你真的不能做任何事情婉约与一类像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如果不能不管出于什么原因而获得所需的值:“位置”不存在,“位置”不是地图,“位置”映射不包含“经度”等