Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json scala中的模式匹配列表_Json_Scala_Pattern Matching_Sequence - Fatal编程技术网

Json scala中的模式匹配列表

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

因此,我试图对从Json转换而来的自定义对象列表进行模式匹配。编译器无法确定序列的内容,例如List[Int]与List[String]相同,因此我目前无法区分不同的对象,因此无法正确处理它们

我已经检索了Json数据,对其进行了转换,然后成功地将其映射到我的模型,因此下面的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))
    }

  }
任何帮助或见解都将不胜感激

这是相似的,但不是相同的,重要的是,这个问题的解决方案似乎没有帮助

问题与@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表单来实现这一点,以避免为每个模型编写不必要的代码。