Scala/Jerkson: указание формата объектов Date в Json


Я сериализую объект, содержащий Date, используя библиотеку Jerkson Json (оболочка для Jackson):

import com.codahale.jerkson.Json
import java.util.Date

case class JTest(
    val dTest: Date
)

val jt = new JTest(new Date())
println(Json.generate(jt))

В результате чего:

{"dTest":1353576079168}

Есть ли способ указать формат или переопределить производящую функцию?

Я понимаю, что Json не имеет правильного типа даты, поэтому вывод (Unix time in millis) является "правильным". Я бы хотел, чтобы мои даты были сериализованы в виде строк в форматеISO 8601 (со временем/часовым поясом) : 2007-04-05T01:12:22+0100, так как он легко разбирается и читается человеком. Date's toString выплевывает Thu Nov 22 10:27:54 CET 2012.

1 2

1 ответ:

Здесь есть два вопроса. Во-первых, незначительная проблема дат ISO8601-они достижимы с помощью SimpleDateFormat, например

import java.text._
import java.util._
val d1 = new Date()
val sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
println(sdf.format(d1))

Форматер будет анализировать, а также форматировать. Помните, что не следует делиться им между потоками (вместо этого всегда создавайте экземпляр в локальной области перед использованием), потому что он не является потокобезопасным.

Во-вторых, более сложные проблемы с помощью автоматического времени в Jerkson. Это, по-видимому, одна из особенностей Jerkson, которая уступает Lift-json. Последнее позволяет пользовательский синтаксический анализатор / форматирующий код, который будет вставлен в слой синтаксического анализа. А вот джерксон, я думаю, нет.

Мы получили вокруг этого ограничения, просто игнорируя его. Нам нравится Превосходная производительность Jerkson, поэтому мы просто используем Long и String для нашей передачи даты, и мы имеем дело с разбором отдельно. Например

case class JTest(val dTest: String) {
  lazy val dTestDate: Date = {
    val sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
    sdf.parse(dTest)
  }
}