【问题标题】:Scala cats - problem with encoding/decoding jsonsScala 猫 - 编码/解码 json 的问题
【发布时间】:2019-09-10 02:44:17
【问题描述】:

我创建了一个简单的路线:

class MyRoutes[F[_] : Async](service: MyService[F]) extends Http4sDsl[F] {

  def routes: HttpRoutes[F] = HttpRoutes.of[F] {
    case req@PUT -> Root / "bets" =>
      for {
        bet <- req.as[Bet]
        created <- service.put(bet)
        response <- Created(created)
      } yield response
}

还有一个 jsons implicits 用于输入和输出:

object jsons {
  implicit def circeDecoder[A[_] : Sync, B: Decoder]: EntityDecoder[A, B] = jsonOf[A, B]
  implicit def circeEncoder[A[_] : Sync, B: Encoder]: EntityEncoder[A, B] = jsonEncoderOf[A, B]
}

但是当我通过 Postman 运行这个程序时,我得到了一个错误: The request body was invalid.422 错误代码。我认为是json编码器和解码器有问题,因为我的要求非常简单明了:

{       
    "stake": 434,
    "name": "Something"
}

我尝试在路由中添加一个隐式解码器:

 implicit val betDecoder: EntityDecoder[F, Bet] = jsonOf[F, Bet]

但它也没有帮助。谁能帮助我并告诉我如何为 jsons 创建好的编码器和解码器?我使用circe 库进行解析。

【问题讨论】:

  • BetDecoder 的定义在哪里Bet
  • @Koterpillar TS 在他之前的question 中定义了Bet。我猜Bet 的解码器是由 Circe 自动生成的。我猜代码是gist.github.com/DmytroMitin/bbf886b02007f09964b512cfd15208b9
  • @DmytroMitin 是的,它看起来像这样。那么如果编码器和解码器是由 Circe 自动生成的,为什么它不能正常工作呢?
  • 如果您正在为案例类派生解码器,它将期望案例类的所有成员都在 JSON 中。请提供您的完整定义 - 无法猜测问题的问题所在。

标签: json scala scala-cats circe http4s


【解决方案1】:

好吧,笨蛋,我解决了这个问题。 我(可能)对Bet 有错误的定义。那是:

case class Bet(betId: BetId, stake: BigDecimal, name: String)

case class BetId(betId: String) extends AnyVal

所以我应该给Id 作为参数。我把代码改成了这个:

case class Bet(betId: Option[BetId], stake: BigDecimal, name: String)

case class BetId(betId: String) extends AnyVal

在这之后一切正常。 另一个问题是 - 这是一种好的做法还是可以以更好的方式完成?

【讨论】:

  • 对我来说没关系。更好的选择是创建两个案例类,例如PartialBet(没有id)和BetId。然后,当您将 id 分配给您的实体时,只需将其映射到更广泛的案例类。您可以手动完成,也可以使用 henkan 之类的库。另一种选择是将客户端的 id 分配为 uuid。
  • 谢谢。不知道这个库,但看起来很有趣。
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 2023-04-09
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
相关资源
最近更新 更多