将键应用于通过 Scala 中的模式匹配获得的映射(类型已擦除)

Apply key to map obtained via pattern matching in Scala (type erased)

我正在尝试查询 API 其中 returns 一个 JSON 数组(例如 [{"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 映射会引发编译器警告。

我是不是走错了路?或者,也许我使用不同的 HTTP/JSON 库会有更好的运气?

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

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

我们在这里排序 "cheat" 因为我们知道 JSON 中的键总是字符串。

关于你的最后一个问题,如果你需要一些轻量级的东西,我认为你这里有的东西已经很简单了。


如果您想通过模式匹配做一些更强大的事情,请查看 this SO post。