【问题标题】:get nested fields of Scala map获取 Scala 地图的嵌套字段
【发布时间】:2018-02-01 14:05:36
【问题描述】:

我有以下地图对象:

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]
          }

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

【问题讨论】:

    标签: json scala scala-collections


    【解决方案1】:

    这取决于“优雅/干净”的概念,因为那种数据结构并不好闻。

    无论如何,内部模式匹配可以与外部模式匹配,如下所示:

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

    【讨论】:

      【解决方案2】:

      你不能用像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:“位置”不存在,“位置”不是地图,“位置”地图不包含“经度”等.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-18
        • 1970-01-01
        • 2015-02-11
        • 1970-01-01
        • 2016-10-14
        • 2020-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多