在 Play 2.3 中,我有一个带有单个可选 double 成员的案例类:
case class SomeClass(foo: Option[Double])
我需要一个 JSON 写入转换器,将成员处理为可为空的:
implicit val someClassWrite: Writes[SomeClass] = ???
Play docs provide an example :
case class DisplayName(name:String)
implicit val displayNameWrite: Writes[DisplayName] = Writes {
(displayName: DisplayName) => JsString(displayName.name)
}
但可悲的是,我无法弄清楚如何为 1)单个可空和 2) double 执行此操作。有任何想法吗?谢谢。
更新#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
句法: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]
和 Option[String]
)。
关于scala - 如何为具有单个可为空成员的案例类编写 Play JSON 写入转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26457395/