【发布时间】: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 库进行解析。
【问题讨论】:
-
Bet和Decoder的定义在哪里Bet? -
@Koterpillar TS 在他之前的question 中定义了
Bet。我猜Bet的解码器是由 Circe 自动生成的。我猜代码是gist.github.com/DmytroMitin/bbf886b02007f09964b512cfd15208b9 -
@DmytroMitin 是的,它看起来像这样。那么如果编码器和解码器是由 Circe 自动生成的,为什么它不能正常工作呢?
-
如果您正在为案例类派生解码器,它将期望案例类的所有成员都在 JSON 中。请提供您的完整定义 - 无法猜测问题的问题所在。
标签: json scala scala-cats circe http4s