代码之家  ›  专栏  ›  技术社区  ›  Cheetah

用自己的编解码器包装circe解码器(隐式)

  •  0
  • Cheetah  · 技术社区  · 6 年前

    我使用circe通过 deriveDecoder . 有一些自定义的ADT,我想把我自己的解码器传给circe,以便在它解析隐式解码器时使用。

    package object json {
      implicit val myAdtDecoder: Decoder[MyAdt] = ...
    }
    

    deriveDecoder公司 .

    有什么方法可以设置,所以我只需要一个导入?一种circe的“代理人” deriveDecoder公司 方法仍将使用我的隐式 MyAdt ?

    package object json {
      implicit val myAdtDecoder: Decoder[MyAdt] = ...
    
      implicit def deriveDecoder[T]: Decoder[T] = ...
    }
    

    注意如果我具体 T T型

    1 回复  |  直到 6 年前
        1
  •  0
  •   Mateusz Kubuszok    6 年前

    那个 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 .