强制播放到JSON将时间戳序列化为字符串,而不是整数秒

时间:2014-04-24 17:54:22

标签: scala playframework jackson

我试图弄清楚如何让Play的#Son方法将java.sql.Timestamp / java.sql.Date对象序列化为日期/时间字符串,而不是自纪元以来的秒数,这似乎是是默认值。我尝试过两种方法来实现这个目标:

1)我在全局onStart处理程序中将Jackson JSON配置默认更改为here

import play.api._
import play.libs.Json

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.SerializationFeature

object Global extends GlobalSettings {
  override def onStart(app: play.api.Application){
    println("really started")
    var om = new ObjectMapper()
    om.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
    Json.setObjectMapper(om)
  }
}

但这似乎没有任何效果。我可以告诉代码是基于println语句执行的,但序列化不受影响。

2)为java.sql.Date对象编写自定义Writer:

implicit val sqlDateWrites: Writes[java.sql.Date] = new Writes[java.sql.Date] {
   def writes(d: java.sql.Date): JsValue = JsString("WTF")
}

然而,这也不起作用。我不确定我是如何编写它的错误,或者我是否只是将它包含在错误的位置(我在同一个文件中将其声明为I&I? #39; m call" toJson" in。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

你正在混合Play的Java JSON库和它的Scala库。

如果您使用的是Scala,请仅使用play.api.libs.json。如果你是Java,play.libs.Json

要创建Writes[java.sql.Date],请使用您正在使用的任何模式调用Writes.sqlDateWrites(pattern)

val sqlDateWrite = Writes.sqlDateWrites(myPattern)

然后,当您为要转换的任何对象创建Writes时:

case class Foo(id: Long, createdAt: java.sql.Date)

implicit val fooWrites: Writes[Foo] =  (
  (__ \ "id").write[Long] and
  (__ \ "createdAt").write[java.sql.Date](sqlDateWrite)
)(unlift(Foo.unapply))

答案 1 :(得分:0)

https://gist.github.com/fancellu/f4b72e853766acf26bf16a7fb37cb8ac

立即提供此代码,以ISO-8601格式存储