7

我正在使用 play.api.libs.json._ 库。我有这种 Scala 类。我需要以 Json 格式读/写这个类。因为时间戳没有隐式读取器/写入器。我必须提供我自己的。我尝试了几种方法,不幸的是它们都没有奏效。你能建议我怎么做吗?提前致谢!

case class Event(id: Long, startTime: Option[java.sql.Timestamp] = None, endTime: Option[java.sql.Timestamp] = None)

我想以以下 Json 格式发布/获取

{
  "id": 1,
  "startTime": "2011-10-02 18:48:05.123456",
  "endTime": "2011-10-02 20:48:05.123456"
}
4

2 回答 2

10

只需在 Event 类的 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)

  }
于 2015-03-02T15:03:58.800 回答
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

于 2015-03-03T12:59:25.917 回答