我正在尝试查询返回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库?
答案 0 :(得分:1)
您可以将最后一行替换为:
parsed.collect{ case x: Map[_,_] => x.asInstanceOf[Map[String,Any]].get("full_name") }
我们在这里“欺骗”,因为我们知道JSON中的键总是字符串。
关于你的上一个问题,如果你需要一些轻量级的东西,我想你在这里所拥有的就是它的简单。
如果你想用你的模式匹配做更强大的事情,看一下this SO帖子。