eri*_*rip 5 serialization scala case-class play-json
我有一个与HTTP GET请求对应的空案例类:
case class GetFoo() extends MyQueryRequest {
// ...
}
Run Code Online (Sandbox Code Playgroud)
每个消息都有一个伴随对象,描述了它的隐式JSON编写器和阅读器:
object GetFoo extends MyImplicitJsonProvider[GetFoo] {
implicit val write = Json.writes[GetFoo]
implicit val read = Json.reads[GetFoo]
}
Run Code Online (Sandbox Code Playgroud)
但是,因为GetFoo没有参数,所以没有办法(de)序列化它:
Unapply of object
GetFoo没有参数.你在使用空的案例类吗?
将伪布尔变量注入构造函数的解决方法GetFoo,但这是一个kludge.我想将GetFoo(de)serializable作为一个空的JSON对象.我怎样才能做到这一点?
由于GET请求不发送数据,因此如果读取器/写入器被使用则抛出异常会更好,因为请求不应该被写入或读取,但是扩展类需要.
我的设计依赖于GetX类扩展MyQueryRequest和扩展的GetX伴随对象MyImplicitJsonProvider[GetX].
抛出一个错误
如果您只想拥有未实现的隐式值,您可能会这样做
implicit def format: Format[GetFoo] = ???
Run Code Online (Sandbox Code Playgroud)
这将在您需要时在范围中添加隐式,但NotImplementedException如果调用它将抛出一个隐式.
虚拟序列化
如果您希望(de)序列化为空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())
Run Code Online (Sandbox Code Playgroud)
尽可能地抓住它
但是,通过确保(通过更强的类型)您的请求没有内容,最好在编译时捕获错误.要做到这一点,我需要更多的信息MyQueryRequest和MyImplicitJsonProvider帮助你,但我会想象做一些类似的MyQueryRequest[NoContent]或MyQueryRequest[JsValue]取决于你什么时候有一些内容.然后一个需要JSON序列化器,而另一个则不需要.
顺便说一句,您可能希望用case对象替换空的case类,以避免不必要的多次分配(除非你做了一些).
| 归档时间: |
|
| 查看次数: |
1482 次 |
| 最近记录: |