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

时间:2019-01-28 10:52:08

标签: 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
}

我通常会在伴随对象中调用deriveEncoder[A],但这在这里不起作用,因为这里没有引用或Encoder的{​​{1}}。

T类型将作为库提供给客户端,因此我想在此类型中尽可能多地进行样板化,而不是依赖于提供编码器和解码器的客户端代码。是否有一个用circe解决的惯用解决方案,以便客户端为Hello提供一个编码器/解码器,并用于派生T的编码器/解码器?

1 个答案:

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