【问题标题】:Circe deriveDecoder/deriveEncoder could not find Lazy implicit value of type io.circe.generic.encoding.DerivedAsObjectEncoderCirce derivedDecoder/deriveEncoder 找不到 io.circe.generic.encoding.DerivedAsObjectEncoder 类型的惰性隐式值
【发布时间】:2020-05-19 10:40:25
【问题描述】:

我正在尝试为两个案例类生成编码器和解码器:

object EventBusCases {
  case class ValuationRequest(function: RequestValue = ALL_DAY_VALS, interval: RequestValue = IntraDayIntervals.MIN_5)
  implicit val requestDecoder: Decoder[ValuationRequest] = deriveDecoder[ValuationRequest]
  implicit val requestEncoder: Encoder[ValuationRequest] = deriveEncoder[ValuationRequest]

  case class ValuationResponse(values: List[Valuation], function: RequestValue)
  implicit val responseDecoder: Decoder[ValuationResponse] = deriveDecoder[ValuationResponse]
  implicit val responseEncoder: Encoder[ValuationResponse] = deriveEncoder[ValuationResponse]
}

我不断收到类似这样的错误,但对于这两种情况: could not find Lazy implicit value of type io.circe.generic.encoding.DerivedAsObjectEncoder[eventbus.eventBusCases.ValuationResponse]

我决定也尝试为这些类中的自定义类派生编码器和解码器,例如“Valuation”,但我在这些类上也遇到了同样的错误。

我正在使用 Circe 0.12.3Scala 2.12.8,这些是我与 Circe 相关的 Scala 依赖项:

  "com.beachape" %% "enumeratum" % "1.5.14",
  "com.beachape" %% "enumeratum-circe" % "1.5.22",
  "io.circe" %% "circe-core" % "0.12.3",
  "io.circe" %% "circe-generic" % "0.12.3",
  "io.circe" %% "circe-parser" % "0.12.3"

【问题讨论】:

  • 只是一个猜测 - 确保像 Valuation 这样的自定义类的解码器/编码器在隐式范围内 deriveDecoder[ValuationResponse]deriveEncoder[ValuationResponse]
  • 是的,它们与这些基本相同。在具有案例类并作为“隐式验证”的对象内
  • 它们是在同一个EventBusCases 对象内还是不同的对象内?如果不同,请确保那些隐含的 import 。在伴生对象中声明此类类型类的隐式实例也是一种好习惯,因此它们将存在于隐式范围内。
  • 估值是一个由 2 个案例类扩展的特征,其中任何一个都可以进入一个 ValuationResponse,这可能是个问题吗?该列表将包含其中一种类型的对象,而不是同一类型的两种类型。
  • @IvanKurchenko 我已经用我解决它的方式发布了一个答案。如果您想检查。

标签: json scala generics derived circe


【解决方案1】:

因此,我发现完成这项工作的方法是为 ValuationRequest 和 ValuationResponse 以及其中包含的所有自定义类型实现编码器和解码器。

对于 ValuationRequest 和 ValuationResponse,我基本上将此位添加到包含两个案例类的同一个文件中:

object derivation {
  implicit val encodeResponse: Encoder[ValuationResponse] = Encoder.instance {
    case response @ ValuationResponse(_,_) => response.asJson
  }
  implicit val decodeResponse: Decoder[ValuationResponse] =
    List[Decoder[ValuationResponse]](
      Decoder[ValuationResponse].widen
    ).reduceLeft(_ or _)

  implicit val encodeRequest: Encoder[ValuationRequest] = Encoder.instance {
    case response @ ValuationRequest(_,_) => response.asJson
  }
  implicit val decodeRequest: Decoder[ValuationRequest] =
    List[Decoder[ValuationRequest]](
      Decoder[ValuationRequest].widen
    ).reduceLeft(_ or _)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    • 2017-03-26
    • 2020-09-30
    • 1970-01-01
    • 2015-12-18
    相关资源
    最近更新 更多