Принудительно воспроизводить JSON-сериализацию временных меток в виде строк, а не целых секунд
Я пытаюсь выяснить, как заставить метод Play toJSon сериализовать объекты java.sql.Timestamp/java.sql.Date в виде строк даты / времени, а не секунд с начала эпохи, что, по-видимому, является значением по умолчанию. Я попробовал два метода для достижения этой цели:
1) Я изменил конфигурацию Jackson JSON по умолчанию, как показано здесь в глобальном обработчике onStart:
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) Написать собственный Writer для объекта java.sql.Date:
implicit val sqlDateWrites: Writes[java.sql.Date] = new Writes[java.sql.Date] {
def writes(d: java.sql.Date): JsValue = JsString("WTF")
}
Однако это тоже не работает. Я не уверен, является ли это ошибкой в том, как я пишу это, или я просто включаю это в неправильное место (я объявляю это в том же файле, в котором я называю toJson).
Любая помощь будет оценена.
1 ответ
https://gist.github.com/fancellu/f4b72e853766acf26bf16a7fb37cb8ac
Воспользуйтесь этим кодом, сохраняется в формате ISO-8601.
Вы смешиваете библиотеку Java JSON от Play и библиотеку 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))