将密钥应用于通过Scala中的模式匹配获得的地图(类型已擦除)

时间:2017-01-04 03:50:44

标签: json scala type-erasure

我正在尝试查询返回JSON数组的API(例如[{"name":"obj1", "value":5}, {"name":"obj2", "value":2}])并处理结果,该结果将被解析为Option[List[Map[String,Any]]]。但是,我不确定如何正确提取每个Map,因为类型在运行时被删除。

import scala.util.parsing.json._
import scalaj.http._

val url = "https://api.github.com/users/torvalds/repos"
val req = Http(url).asString

val parsed = JSON.parseFull(req.body) match {
  case Some(data) => data match {
    case list: List[_] => list
    case _ => sys.error("Result is not a list.")
  }
  case None => sys.error("Invalid JSON received.")
}

parsed.foreach{
  case x: Map[_,_] => x.get("full_name") // error here
}

发生错误是因为我无法使用String键类型应用该函数。但是,由于类型擦除,键和值类型是未知的,并指定它是一个String映射会引发编译器警告。

我是以错误的方式做事吗?或者也许我会有更好的运气与不同的HTTP / JSON库?

1 个答案:

答案 0 :(得分:1)

您可以将最后一行替换为:

parsed.collect{ case x: Map[_,_] => x.asInstanceOf[Map[String,Any]].get("full_name") }

我们在这里“欺骗”,因为我们知道JSON中的键总是字符串。

关于你的上一个问题,如果你需要一些轻量级的东西,我想你在这里所拥有的就是它的简单。

如果你想用你的模式匹配做更强大的事情,看一下this SO帖子。