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 ответ:
Здесь есть два вопроса. Во-первых, незначительная проблема дат 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) } }