Akka HTTP:解组类与泛型类型参数

时间:2019-01-29 15:41:01

标签: json scala akka akka-http

我有以下课程

case class PaginatedSearchResult[T : RootJsonFormat](pages: Option[Page], objects: Option[Seq[T]])

object PaginatedSearchResult extends DefaultJsonProtocol {
  implicit val format = jsonFormat2(PaginatedSearchResult.apply)
}

我正试图将其解组:

Unmarshal(response.entity).to[PaginatedSearchResult[T]]

这是我得到的错误

Error:(15, 59) could not find implicit value for evidence parameter of type spray.json.RootJsonFormat[T]
  implicit val format = jsonFormat2(PaginatedSearchResult.apply)

我正在尝试弄清楚如何正确地将其解组。任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:2)

有两个问题:

定义jsonFormat2(PaginatedSearchResult.apply)时,您会缺少类型RootJsonFormat[T]的隐式值,这是构造函数/应用方法中所必需的。编译器无法为任何T知道它,并且给您错误

Error:(15, 59) could not find implicit value for evidence parameter of type spray.json.RootJsonFormat[T]

您可以通过将格式定义为def

来修复它
implicit def format[T: RootJsonFormat] = jsonFormat2(PaginatedSearchResult.apply)

第二个问题是您需要使用格式的地方

Unmarshal(response.entity).to[PaginatedSearchResult[T]]

在这种情况下,您必须使用具体的T或在隐式范围内使用RootJsonFormat[T]

您可以这样做

def unmarshal[T: RootJsonFormat] = { 
  Unmarshal(response.entity).to[PaginatedSearchResult[T]]
}

例如,如果您有类型unmarshal[User],请将其用作User

答案 1 :(得分:0)

我设法用以下代码解决了这个问题:

if(!isLocalPlayer)