Как расшифровать общий класс 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
}