将键应用于通过 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。
我正在尝试查询 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。