gpt4 book ai didi

scala - 如何使用 play-json 编写和读取空案例类?

转载 作者:行者123 更新时间:2023-12-04 18:02:21 25 4
gpt4 key购买 nike

我有一个对应于 HTTP GET 请求的空案例类:

case class GetFoo() extends MyQueryRequest {
// ...
}

每条消息都有一个伴随对象,描述了它的隐式 JSON 写入器和读取器:
object GetFoo extends MyImplicitJsonProvider[GetFoo] {
implicit val write = Json.writes[GetFoo]
implicit val read = Json.reads[GetFoo]
}

但是,因为 GetFoo没有参数,没有办法(反)序列化它:

Unapply of object GetFoo has no parameters. Are you using an empty case class?



将虚拟 bool 变量注入(inject) GetFoo 的构造函数的解决方法,但这是一个kludge。我想做 GetFoo (反)可序列化为空的 JSON 对象。我怎样才能做到这一点?

由于 GET 请求不发送数据,因此如果正在使用读取器/写入器,最好让其抛出异常,因为该请求不需要被写入或读取,但扩展类需要它。

我的设计依赖于 GetX类扩展 MyQueryRequestGetX扩展的伴随对象 MyImplicitJsonProvider[GetX] .

最佳答案

抛出错误

如果您只想拥有未实现的隐式值,您可能会做得很好

implicit def format: Format[GetFoo] = ???

这将在您需要时将隐式添加到范围中,但会抛出 NotImplementedException如果它被调用。

虚拟序列化

如果你想(反)序列化为空 JsObject ,只需这样实现它:
implicit val nonStrictReads = Reads.pure(GetFoo()) // does not check anything on the `JsValue`, always give a `JsSuccess(GetFoo())`
implicit val strictReads = Reads[GetFoo](json => json.validate[JsObject].filter(_.values.isEmpty).map(_ => GetFoo())
implicit val writes = OWrites[GetFoo](_ => Json.obj())

趁你能捕获它

但是,最好在编译时捕获错误,方法是确保(通过更强的类型)您的请求没有内容。为此,我需要有关 MyQueryRequest 的更多信息。和 MyImplicitJsonProvider帮助你,但我会想象做一些像 MyQueryRequest[NoContent]MyQueryRequest[JsValue]取决于你什么时候有一些内容。然后一个需要 JSON 序列化程序,而另一个不需要。

顺便说一句,您可能希望用一个案例对象替换您的空案例类,以避免不必要的多次分配(除非您执行 some )。

关于scala - 如何使用 play-json 编写和读取空案例类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43096129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com