我正在使用circe通过deriveDecoder提供的半自动解码器派生。我有一些自定义的ADT,当circe解析隐式解码器时,我希望传递自己的解码器供circe使用。
package object json {
implicit val myAdtDecoder: Decoder[MyAdt] = ...
}这是可行的,尽管我现在需要在调用circe的deriveDecoder的文件中有两个导入。
有没有一种方法可以让我只需要一次导入?circe的deriveDecoder方法的某种“代理”,它仍将使用我的隐式MyAdt
package object json {
implicit val myAdtDecoder: Decoder[MyAdt] = ...
implicit def deriveDecoder[T]: Decoder[T] = ...
}注如果我在这里显式地指定了T,我解决这个问题是没有问题的,但是我想保持它的泛型,这样它就可以在任何T上工作。
发布于 2018-08-20 23:36:08
该deriveDecoder在这里将是自动的(您不想自己调用它),但是您尝试导入半自动版本。
使用自动方法,您可以:
trait ExtendedAuto extends io.circe.generic.AutoDerivation {
implicit val myAdtDecoder: Decoder[MyAdt] = ...
}
package object json extends ExtendedAuto您必须小心不要(意外地)导入相同的隐式两次,因为这样会导致派生失败。但是如果你坚持一个原则(例如,在任何地方都一致地导入你的包对象),那么它应该是可以的。
如果是半自动的话就不一样了:
package object json {
implicit val myAdtDecoder: Decoder[MyAdt] = ...
// signatures copy-pasted from io.circe.generic.semiauto
import io.circe.generic.semiauto
final def deriveDecoder[A](implicit decode: Lazy[DerivedDecoder[A]]): Decoder[A] = semiauto.deriveDecoder[A]
final def deriveEncoder[A](implicit encode: Lazy[DerivedObjectEncoder[A]]): ObjectEncoder[A] = semiauto.deriveEncoder[A]
}但是,如果您使用的是半自动,您可能会将内容放入伴生对象中,以避免同一编解码器的多个派生。在这种情况下,您可以考虑使用像@JsonCodec这样的东西。
https://stackoverflow.com/questions/51925646
复制相似问题