从Some()中提取对象并使用它

时间:2017-05-23 16:35:22

标签: scala

在下面的代码中,encoded是一个JSON字符串。 JSON.parseFull()函数返回以下形式的对象:Some(Map(...))。我正在使用.get来提取Map,但由于编译器将其视为类型Any,因此无法对其进行索引。有没有提供编译器可见性,事实上,它是一个地图?

val parsed = JSON.parseFull(encoded)
val mapped = parsed.get

2 个答案:

答案 0 :(得分:1)

您可以使用collect模式匹配来匹配类型:

scala> val parsed: Option[Any] = Some(Map("1" -> List("1")))
parsed: Option[Any] = Some(Map(1 -> List(1)))
scala> val mapped = parsed.collect{
  case map: Map[String, Any] => map
}
mapped: Option[Map[String,Any]] = Some(Map(1 -> List(1)))

List值的情况下,您可以执行以下操作,以获取List中的值:

scala> mapped.get.map{ case(k, List(item1)) => item1}
res0: scala.collection.immutable.Iterable[Any] = List(1)

答案 1 :(得分:1)

我能够使用get函数和模式匹配的组合,类似于Tanjin的响应中发布的,以获得所需的结果。

object ReadFHIR {

  def fatal(msg: String) = throw new Exception(msg)

  def main (args: Array[String]): Unit = {
    val fc = new FhirContext()
    val client = fc.newRestfulGenericClient("http://test.fhir.org/r2")
    val bundle = client.search().forResource("Observation")
      .prettyPrint()
      .execute()

    val jsonParser = fc.newJsonParser()
    val encoded = jsonParser.encodeBundleToString(bundle)
    val parsed = JSON.parseFull(encoded)

    val mapped: Map[String, Any] = parsed.get match{
      case map: Map[String, Any] => map
    }

    println(mapped("resourceType"))
  }

}