首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用自己的编解码器包装circe解码器(隐含)

使用自己的编解码器包装circe解码器(隐含)
EN

Stack Overflow用户
提问于 2018-08-20 15:09:21
回答 1查看 403关注 0票数 0

我正在使用circe通过deriveDecoder提供的半自动解码器派生。我有一些自定义的ADT,当circe解析隐式解码器时,我希望传递自己的解码器供circe使用。

代码语言:javascript
复制
package object json {
  implicit val myAdtDecoder: Decoder[MyAdt] = ...
}

这是可行的,尽管我现在需要在调用circe的deriveDecoder的文件中有两个导入。

有没有一种方法可以让我只需要一次导入?circe的deriveDecoder方法的某种“代理”,它仍将使用我的隐式MyAdt

代码语言:javascript
复制
package object json {
  implicit val myAdtDecoder: Decoder[MyAdt] = ...

  implicit def deriveDecoder[T]: Decoder[T] = ...
}

注如果我在这里显式地指定了T,我解决这个问题是没有问题的,但是我想保持它的泛型,这样它就可以在任何T上工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-20 23:36:08

deriveDecoder在这里将是自动的(您不想自己调用它),但是您尝试导入半自动版本。

使用自动方法,您可以:

代码语言:javascript
复制
trait ExtendedAuto extends io.circe.generic.AutoDerivation {

  implicit val myAdtDecoder: Decoder[MyAdt] = ...
}

package object json extends ExtendedAuto

您必须小心不要(意外地)导入相同的隐式两次,因为这样会导致派生失败。但是如果你坚持一个原则(例如,在任何地方都一致地导入你的包对象),那么它应该是可以的。

如果是半自动的话就不一样了:

代码语言:javascript
复制
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这样的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51925646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档