[我正在尝试弄清楚如何使用Play的toJSon方法将java.sql.Timestamp / java.sql.Date对象序列化为日期/时间字符串,而不是自时代以来的秒,这似乎是默认的。我尝试了两种方法来完成此任务:
1)我更改了Jackson的JSON配置默认值,如Global onStart处理程序中的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")
}
但是这也不起作用。我不确定这是如何编写的错误,还是只是在错误的位置包含了它(我在将其称为“ toJson”的文件中声明了它。
任何帮助将不胜感激。
您正在混合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))
https://gist.github.com/fancellu/f4b72e853766acf26bf16a7fb37cb8ac
立即提供此代码,以ISO-8601格式存储