Scala Play框架中Timestamp的隐式读写器

7
我正在使用play.api.libs.json._库。我有这种Scala类。我需要以Json格式读取/写入此类。由于没有Timestamp的隐式读取器/编写器,我必须提供自己的读取器/编写器。我尝试了几种方式,但不幸的是,它们都没有起作用。请问您能否建议我如何做到这一点?提前感谢!
case class Event(id: Long, startTime: Option[java.sql.Timestamp] = None, endTime: Option[java.sql.Timestamp] = None)

我想以以下Json格式进行POST / GET请求。
{
  "id": 1,
  "startTime": "2011-10-02 18:48:05.123456",
  "endTime": "2011-10-02 20:48:05.123456"
}
2个回答

10
只需在事件类的Json Reader或Json Format之前添加即可。
import play.api.libs.json.Json._
import play.api.libs.json._ 

def timestampToDateTime(t: Timestamp): DateTime = new DateTime(t.getTime)

def dateTimeToTimestamp(dt: DateTime): Timestamp = new Timestamp(dt.getMillis)

implicit val timestampFormat = new Format[Timestamp] {

    def writes(t: Timestamp): JsValue = toJson(timestampToDateTime(t))

    def reads(json: JsValue): JsResult[Timestamp] = fromJson[DateTime](json).map(dateTimeToTimestamp)

  }

2
dateTimeToTimestamp 接受 DateTime 参数。那么如何调用 def reads(json: JsValue): JsResult[Timestamp] = fromJsonDateTime.map(dateTimeToTimestamp)?仍然未定义 toJson、fromJson。 - masiboo
不要忘记添加 import play.api.libs.json.Json._ 或在 toJson、fromJson 前添加 Json. - Lucky Libora
要解析时间戳,您只需使用Json.fromJsonTimestamp。timestampFormat将被隐式使用。 - Lucky Libora
似乎您的回答是在DateTime和Timestamp之间进行转换。但我的问题是如何将作为字符串传入的JSON转换为Timestamp。我不需要DateTime,因为Play提供了DateTime隐式读取器和写入器。如果您知道如何做,请更新您的答案。谢谢! - masiboo
2
这个使用哪个DateTime类? - Simon
显示剩余3条评论

5

我为个人项目编写的代码:

implicit object timestampFormat extends Format[Timestamp] {
  val format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS'Z'")
  def reads(json: JsValue) = {
    val str = json.as[String]
    JsSuccess(new Timestamp(format.parse(str).getTime))
  }
  def writes(ts: Timestamp) = JsString(format.format(ts))
}

并且不要忘记导入这个:

import java.sql.Timestamp
import java.text.SimpleDateFormat
import play.api.Play.current
import play.api.libs.json._

它遵守JavaScript日期标准。
来源:https://github.com/BinaryBrain/Gamers/blob/master/server/play/app/models/Package.scala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接