我正在尝试使用功能语法编写自定义 json 序列化程序,但我似乎找不到解决这个特定问题的正确方法。我有几个 joda DateTime 对象,我想为使用它的 UI 以特定格式编写它们。谁能告诉我我哪里出错了?
这是我目前正在处理的案例类,没有什么特别的。
case class Banner(
id: Int = 0,
ownerId: Int = 0,
licenseeId: Option[Int] = None,
statusColor: Option[String] = None,
content: Option[String] = None,
displayStart: DateTime = new DateTime(),
displayEnd: DateTime = new DateTime(),
created: DateTime = new DateTime(),
updated: DateTime = new DateTime()
)
这些是我对序列化程序对象的导入。
import play.api.libs.json._
import play.api.libs.functional.syntax._
import org.joda.time.DateTime
import org.joda.time.format.DateTimeFormat
首先,joda DateTime 隐式转换为 long 就好了,所以如果这就是我想要的,宏扩展器就可以很好地工作。
object MySerializers {
implicit val writesBanner = Json.writes[Banner]
}
我需要将 displayStart 和 displayEnd 对象转换为特定的字符串格式,而不是 long 值。这就是我试图做的。
object MySerializers {
val userDateFormatter = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm a")
implicit val writesBanner = (
(__ \ "id").write[Int] and
(__ \ "ownerId").write[Int] and
(__ \ "licenseeId").write[Int] and
(__ \ "statusColor").writeNullable[String] and
(__ \ "content").writeNullable[String] and
(__ \ "displayStart").write[DateTime].inmap[String](dt => userDateFormatter.print(dt)) and
(__ \ "displayEnd").write[DateTime].inmap[String](dt => userDateFormatter.print(dt)) and
(__ \ "created").write[DateTime] and
(__ \ "updated").write[DateTime]
)(unlift(Banner.unapply))
}
但是编译器对此并不满意,所以我似乎不明白使用 inmap 函数的正确方法。
could not find implicit value for parameter fu:
play.api.libs.functional.InvariantFunctor[play.api.libs.json.OWrites]
[error] (__ \ "displayStart").write[DateTime].inmap[String](dt =>
userDateFormatter.print(dt)) and
[error] ^
非常感谢任何建议。