scala - 如何为具有单个可为空成员的案例类编写 Play JSON 写入转换器

标签 scala playframework scala-2.10 playframework-2.3

在 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/

相关文章:

playframework - 如何创建Promise <Result> play2.0框架-Java

playframework - Play 框架 2.0 模板参数导入

scala - Scala 2.10 里程碑中的 toArray

Scala:多个具有相同名称的隐式转换

scala - 使用 Scala 从 Stream 构建树

scala - 在 Scala 中实现 Java 接口(interface)方法

Scala:我们可以在密封的案例类声明中预先将保护条件与模式匹配结合起来吗

java - 使用 AWS Java DynamoDB 流 Kinesis 适配器处理 DynamoDB 流

java - 图像大小调整: original color has been changed after the resize

scala - 为什么Scala有SeqView而没有SetView?