json - 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
库进行解析。
解决方案
好吧,我傻了,我解决了这个问题。我(可能)对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
在这之后一切正常。另一个问题是 - 这是一种好的做法还是可以以更好的方式完成?
推荐阅读
- javascript - 如何以编程方式正确移动对象?
- javascript - 我对 call() 感到困惑,为什么我的代码不起作用?
- php - PHP - array_push 将 JSON 数组转换为对象
- c++ - 如何实现双向链表的迭代器?
- javascript - 如何使用 emailjs 发送电子邮件?
- c# - 有没有一种简单的方法可以在 AspNetRoles 表中添加一列?
- javascript - 如何为使用 JavaScript 函数添加的文本字符串设置样式?
- javascript - 为什么控制台打印多个值如何修复它应该打印一次
- java - 我gana制作了一个音乐播放器,在接听电话时暂停播放,并在接听完成后重新启动
- javascript - 邀请所有团队成员加入新 Slack 频道的脚本