Принудительно воспроизводить 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))
Другие вопросы по тегам