我希望为以下案例类提供JSON编码器:
import io.circe.generic.extras.Configuration
final case class Hello[T](
source: String,
version: Int = 1,
data: T
)
object Hello {
implicit val configuration: Configuration = Configuration.default.withDefaults
}
我通常会在伴随对象中调用deriveEncoder[A]
,但这在这里不起作用,因为这里没有引用或Encoder
的{{1}}。
T
类型将作为库提供给客户端,因此我想在此类型中尽可能多地进行样板化,而不是依赖于提供编码器和解码器的客户端代码。是否有一个用circe解决的惯用解决方案,以便客户端为Hello
提供一个编码器/解码器,并用于派生T
的编码器/解码器?
答案 0 :(得分:6)
是的,您需要添加上下文绑定,要求任何类型T
都必须包含隐式编码器:
final case class Hello[T](
source: String,
version: Int = 1,
data: T
)
object Hello {
implicit def helloEncoder[T: Encoder]: Encoder[Hello[T]] = deriveEncoder
}
例如,当用户创建自己的Hello[Foo]
类型时,他们必须确保Foo
具有自己的编码器。