首页 > 解决方案 > Scala 猫 - 编码/解码 json 的问题

问题描述

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

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
}

implicits以及用于输入和输出的 jsons :

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

标签: jsonscalascala-catscircehttp4s

解决方案


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

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


推荐阅读