我试图弄清楚如何让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。
任何帮助都将不胜感激。
答案 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格式存储