首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Play框架的JSON库定制JodaTime序列化?

使用Play框架的JSON库定制JodaTime序列化?
EN

Stack Overflow用户
提问于 2013-08-15 23:00:16
回答 2查看 11.5K关注 0票数 17

如何实现自定义JodaTime的DateTime序列化/反序列化?我倾向于使用Play Framework的JSON库(2.1.1)。有一个默认的DateTime序列化程序,但它使用dt.getMillis而不是.toString,后者将返回符合DateTime的字符串。

为case类编写ReadsT和WritesT似乎相当简单,但我不知道如何为DateTime做同样的事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-18 23:01:23

我使用Play 2.3.7,并在伴生对象中使用字符串模式定义隐式读/写:

代码语言:javascript
复制
case class User(username:String, birthday:org.joda.time.DateTime)

object User {
  implicit val yourJodaDateReads = Reads.jodaDateReads("yyyy-MM-dd'T'HH:mm:ss'Z'")
  implicit val yourJodaDateWrites = Writes.jodaDateWrites("yyyy-MM-dd'T'HH:mm:ss'Z'")
  implicit val userFormat = Json.format[User]
}
票数 19
EN

Stack Overflow用户

发布于 2013-09-18 13:51:38

另一种可能更简单的解决方案是制作一张地图,例如:

代码语言:javascript
复制
case class GoogleDoc(id: String, etag: String, created: LocalDateTime)

object GoogleDoc {
  import org.joda.time.LocalDateTime
  import org.joda.time.format.ISODateTimeFormat

  implicit val googleDocReads: Reads[GoogleDoc] = (
      (__ \ "id").read[String] ~
      (__ \ "etag").read[String] ~
      (__ \ "createdDate").read[String].map[LocalDateTime](x => LocalDateTime.parse(x, ISODateTimeFormat.basicdDateTime()))
  )(GoogleDoc)
}

更新

如果您经常需要此转换,那么您可以创建自己的隐式转换,它只需几行代码:

代码语言:javascript
复制
import org.joda.time.LocalDateTime
import org.joda.time.format.ISODateTimeFormat

implicit val readsJodaLocalDateTime = Reads[LocalDateTime](js =>
  js.validate[String].map[LocalDateTime](dtString =>
    LocalDateTime.parse(dtString, ISODateTimeFormat.basicDateTime())
  )
)
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18255504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档