Json scala中的模式匹配列表
因此,我试图对从Json转换而来的自定义对象列表进行模式匹配。编译器无法确定序列的内容,例如List[Int]与List[String]相同,因此我目前无法区分不同的对象,因此无法正确处理它们 我已经检索了Json数据,对其进行了转换,然后成功地将其映射到我的模型,因此下面的myFunction就是导致问题的部分——无法识别数据类型:Json scala中的模式匹配列表,json,scala,pattern-matching,sequence,Json,Scala,Pattern Matching,Sequence,因此,我试图对从Json转换而来的自定义对象列表进行模式匹配。编译器无法确定序列的内容,例如List[Int]与List[String]相同,因此我目前无法区分不同的对象,因此无法正确处理它们 我已经检索了Json数据,对其进行了转换,然后成功地将其映射到我的模型,因此下面的myFunction就是导致问题的部分——无法识别数据类型: trait SuperT case class User(firstname: String, firstname: String, dob: Opti
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))
}
}
任何帮助或见解都将不胜感激
这是相似的,但不是相同的,重要的是,这个问题的解决方案似乎没有帮助
问题与@markusthoemmes链接的问题完全相同。然而,哪些解决方案是适用的,以及它们需要如何调整,可能并不明显,尤其是在没有足够的Scala经验的情况下
如果您只是从某个地方获得了一个列表[SuperT],那么基于清单/类标签/类型标签的解决方案将不会有帮助。他们需要在某个阶段有一个列表[用户]
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)?
}
如果您可以假设列表中只包含用户或国家,则应该可以使用。否则,您可以使用partition或groupBy按类划分为列表,并决定如何处理每个列表
<>但是你也应该首先考虑为什么有一个列表[Stutt ];在您创建它的那一刻,您是否有关于响应中是否包含用户或国家的信息?如果您这样做了,它可以与列表一起传递,并且解决您的问题,而不需要类型匹配的丑陋。可能重复@markusthoemmes-它类似但不相同,重要的是,该问题的解决方案似乎没有帮助。在不使问题复杂化的情况下;由于每个模板都指定了每个列表类型,因此必须将其作为确切的列表类型传递。是的,这看起来确实是一种混乱的方式,因此我找到了一个更简单的解决方案,正如您所建议的。总的来说,我希望在monad上有一个简单的模式匹配方法——我目前正试图用scala表单来实现这一点,以避免为每个模型编写不必要的代码。