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

问题描述 投票:2回答:2

[我正在尝试弄清楚如何使用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”的文件中声明了它。

任何帮助将不胜感激。

scala playframework jackson
2个回答
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))

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.