如何使用JSON Writes编写日期以符合ISO 8601格式?

3

我有一个案例类

import java.sql.Date
case class GetMilestoneLanguage(
                               ...
                   due_date: Option[Date],
                                ...
                   )
object GetMilestoneLanguage {
  implicit val writes = Json.writes[GetMilestoneLanguage]
}

输出的JSON是UTC时间格式,我需要它转换为ISO 8601格式。我不使用Joda时间库。

有什么最简单的方法可以将日期转换为ISO 8601格式吗?

谢谢。

2个回答

8
import play.api.libs.json.{Json, Writes}
import play.api.libs.json.Writes.dateWrites // do not import everything here, especially DefaultDateWrites

case class GetMilestoneLanguage(param1: String, dueDate: Option[java.sql.Date])

object GetMilestoneLanguage {
  implicit val customDateWrites: Writes[java.util.Date] = dateWrites("yyyy-MM-dd'T'HH:mm:ss'Z'")

  implicit val writes =  Json.writes[GetMilestoneLanguage]
}

关键在于定义自己的隐式Writes[java.util.Date]。如果导入DefaultDateWrites,你的customDateWrites将被默默忽略(我想知道为什么没有歧义的隐式警告)。

1
你可以使用 import play.api.libs.json.Writes.{ dateWrites => _, _ => _ } 导入除了 dateWrites 以外的所有内容。我认为你的答案比我的更好。 - Ryan
谢谢你的提示!我不知道那个语法。 - Dimitri
谢谢 - 我只是要把我的接受移到这里 - 因为使用JSON写入宏助手可以节省样板文件。 - brent

1
你可以使用 Writes 伴生对象提供的辅助工具来创建自定义的 Writes[java.util.Date]。但是,你不能使用 Json.writes 宏辅助工具。
import play.api.libs.json._
import play.api.libs.functional.syntax._
import play.api.libs.json.Writes._

case class GetMilestoneLanguage(param1: String, dueDate: Option[Date], param3: String)

object GetMilestoneLanguage {
  implicit val writes = (
    (__ \ "param1").write[String] and
    (__ \ "due_date").write(dateWrites("yyyy-MM-dd'T'HH:mm:ss'Z'")) and
    (__ \ "param3").write[String]
  )(unlift(GetMilestoneLanguage.unapply))
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接