Scala cats - 编码/解码json的问题

问题描述 投票:1回答:1

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

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

json scala scala-cats circe http4s
1个回答
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

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

© www.soinside.com 2019 - 2024. All rights reserved.