具有默认参数的通用案例 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
有自己的编码器。
我希望为以下情况提供 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
有自己的编码器。