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

时间:2019-04-19 22:21:58

标签: json scala scala-cats circe http4s

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

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]
}

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

好吧,愚蠢的我,我解决了这个问题。 我对driversig的定义错误(可能)。是:

Bet

所以我应该给case class Bet(betId: BetId, stake: BigDecimal, name: String) case class BetId(betId: String) extends AnyVal 作为参数。我将代码更改为此:

Id

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