具有默认参数的通用案例类的Circe编码器

Ric*_*rth 2 json scala circe

我期待为以下案例类提供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
}
Run Code Online (Sandbox Code Playgroud)

我通常会叫deriveEncoder[A]的同伴对象,但因为没有参考或已经不在这里工作EncoderT这里.

Hello类型将作为库提供给客户端,因此我希望在此类型中尽可能多地使用样板,而不是依赖于提供编码器和解码器的客户端代码.是否有一个惯用的解决方案与circe,以便客户端提供编码器/解码器T,这用于导出编码器/解码器Hello[T]

Yuv*_*kov 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
}
Run Code Online (Sandbox Code Playgroud)

这样,当用户创建自己的Hello[Foo]类型时,他必须确保Foo拥有自己的编码器.

  • 这是正确的答案.@Rich注意到你所说的"比依赖于提供编码器和解码器的客户代码"的部分无法实现; 在Yuval的解决方案中,他们仍然必须自己提供编码器.如果你希望他们有自由选择自己的T,那就是付出的代价. (3认同)