Akka HTTP: Unmarshal для класса с параметром универсального типа - PullRequest
0 голосов
/ 29 января 2019

У меня есть следующий класс

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 голосов
/ 29 января 2019

Мне удалось исправить это с помощью следующего кода:

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

object PaginatedSearchResult extends DefaultJsonProtocol {
  implicit def format[T : JsonFormat]: RootJsonFormat[PaginatedSearchResult[T]] = jsonFormat2(PaginatedSearchResult.apply[T])
}
0 голосов
/ 29 января 2019

Есть две проблемы:

Когда вы определяете jsonFormat2(PaginatedSearchResult.apply), вы пропускаете неявное значение типа RootJsonFormat[T], как это требуется в вашем методе constructor / apply.Компилятор не может знать это для любого 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, например.

...