所以我尝试模式匹配已从List
转换的自定义对象的Json
。编译器无法确定Sequences
的内容,例如List[Int]
与List[String]
相同,因此我目前无法区分不同的对象,因此无法正确处理它们。
我已经检索了Json
个数据transformed
,然后成功将其映射到我的模型,因此myFunction
(下方)是造成问题的部分 - 无法使用识别数据类型:
trait SuperT
case class User(firstname: String, firstname: String, dob: Option[Date]) extends SuperT
case class Country(name: String, continent: Option[String], hemisphere: Option[String]) extends SuperT
def myFunction(jsRes: JsResult[Seq[SuperT]])(implicit request: Request[AnyContent]) = {
jsRes match {
case JsSuccess(data: List[SuperT], path: JsPath) => data match {
// cannot find the differences between the following 2 case types
case u: List[User] => Ok(views.html.db.user.index(Some(u))
case c: List[RgnM] => Ok(views.html.db.country.index(Some(c))
}
case e: JsError => Ok(JsError.toJson(e))
}
}
感谢任何帮助或见解!
答案 0 :(得分:1)
它相似但不一样,重要的是这个问题的解决方案似乎没有帮助
问题 与@markusthoemmes链接问题完全相同。但是,可能并不明显哪些解决方案适用以及如何进行调整,尤其是在没有足够的Scala经验的情况下。
如果您只是从某处获得了List[SuperT]
,那么基于Manifest
/ ClassTag
/ TypeTag
的解决方案将无济于事。他们需要在某个阶段List[User]
。
case JsSuccess(data: List[SuperT], path: JsPath) => data match {
case first :: _ =>
first match {
case _: User =>
Ok(views.html.db.user.index(Some(data.asInstanceOf[List[User]]))
case _: Country =>
Ok(views.html.db.country.index(Some(data.asInstanceOf[List[Country]]))
}
case _ => // what do you want to do if the list is empty (or null)?
}
如果您认为列表仅包含User
s或仅包含Country
es,则应该有效。否则,您可以使用partition
或groupBy
按类拆分列表,并决定如何处理每个列表。
但你也应该考虑为什么你首先有一个List[SuperT]
;在您创建它的那一刻,您是否有关于响应中是否包含用户或国家/地区的信息?如果你这样做,它可以与列表一起传递并解决你的问题,而不会出现类型匹配的丑陋。