Как расшифровать общий класс case с помощью полуавтоматики в Circe

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

case class QueryResult[T: Decoder](data: T)

Работает с автоматическим выводом.

Но я не мог решить это иметь полуавтоматическое происхождение.

Вот мой тестовый пример:

  //import io.circe.generic.auto._ // with this it works
  import io.circe.derivation._

  case class Name(name: String)
  case class QueryResult[T: Decoder](data: T)

  implicit val nameDer = deriveDecoder[Name]
  implicit def result[T: Decoder] = deriveDecoder[QueryResult[T]] // this does not work

Это дает мне:

Error:(16, 50) No method evidence$1 in pme123.graphql.client.QueryResult[T] (this is probably because a constructor parameter isn't a val)
  implicit def result[T: Decoder] = deriveDecoder[QueryResult[T]]

2 ответа

Решение

Какую версию Circe вы используете? В 0.12.3 я должен использоватьimport io.circe.generic.semiauto._ и у меня работает следующее:

case class Name(name: String)
case class QueryResult[T: Decoder](data: T)

implicit val nameDer = deriveDecoder[Name]
implicit def result[T: Decoder] = deriveDecoder[QueryResult[T]]

val json = """{"data": {"name": "foo"}}"""
decode[QueryResult[Name]](json)  // Right(QueryResult(Name(foo)))

Столкнулся с той же проблемой. Это несколько объяснено в комментарии к принятому ответу, но вам необходимо убедиться, что вы добавляете кодеры/декодеры для каждого типа.

Например, вы столкнулись с проблемой, когда Circe каким-то образом не знает, как расшифроватьA, убедитесь, что у вас есть все кодеры/декодеры:

      case class A(someB: B)
object A {
  implicit val decoder: Decoder[A] = deriveDecoder
}

case class B(something: String)
object B {
  // If you forget this, an implicit decoder cannot be derived for A either
  implicit val decoder: Decoder[B] = deriveDecoder
}
Другие вопросы по тегам