在 Play 2.3 中,我有一个带有单个可选双成员的案例类:
case class SomeClass(foo: Option[Double])
我需要一个 JSON 写入转换器来将成员处理为可为空:
implicit val someClassWrite: Writes[SomeClass] = ???
The Play 文档提供了一个示例:
case class DisplayName(name:String)
implicit val displayNameWrite: Writes[DisplayName] = Writes {
(displayName: DisplayName) => JsString(displayName.name)
}
但遗憾的是,我不知道如何为 1)单个可为空值和 2)双精度值执行此操作。有任何想法吗?谢谢。
更新#1:我能想到的唯一解决方案是:
implicit val someClassWrite: Writes[SomeClass] = Writes {
(someClass: SomeClass) => someClass.foo match {
case Some(f) => JsNumber(BigDecimal(f))
case _ => JsNull
}
更新#2:忽略我的解决方案。特拉维斯·布朗就是其中之一。
Writes
不是协变函子,所以你不能使用map
,但你可以使用contramap
:
import play.api.libs.json._
import play.api.libs.functional.syntax._
implicit val someClassWrites: Writes[SomeClass] =
(__ \ 'foo).writeNullable[Double].contramap(_.foo)
如果您有多个会员,您可以使用 Play 的FunctionalBuilder
syntax:
case class AnotherClass(foo: Option[Double], bar: Option[String])
implicit val anotherClassWrites: Writes[AnotherClass] = (
(__ \ 'foo).writeNullable[Double] and
(__ \ 'bar).writeNullable[String]
)(ac => (ac.foo, ac.bar))
在第一种情况下,论证contramap
只是您想要的类型的函数Writes
对于 中的类型Writes
你打电话来contramap
在。在第二种情况下,最后的函数来自目标 (AnotherClass
此处)到一个元组Writes
您构建的实例and
(在这种情况下Option[Double]
and Option[String]
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)