繁体   English   中英

Scala 猫 - 编码/解码 jsons 的问题

[英]Scala cats - problem with encoding/decoding jsons

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

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库进行解析。

好吧,愚蠢的我,我解决了这个问题。 我(可能)对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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM