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

Circe encoder for generic case class with default parameters

我希望为以下情况提供 JSON 编码器 class:

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 for T

Hello 类型将作为库提供给客户,因此我想在此类型中做尽可能多的样板文件,而不是依赖于提供编码器和解码器的客户端代码。是否有 circe 的惯用解决方案,以便客户为 T 提供 encoder/decoder,这用于派生 Hello[T] 的 encoder/decoder?

是的,您需要添加一个上下文绑定,要求任何类型都存在隐式编码器T:

import io.circe.gemeric.semiauto._

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 有自己的编码器。