簡體   English   中英

在游戲中將Json轉換為Joda DateTime! 斯卡拉2.5

[英]Convert Json to Joda DateTime in Play! scala 2.5

我已經閱讀了這個問題 (以及關於SO的其他問題),但是我仍然無法通過Joda DateTime將JsValue轉換為案例類。

這是我擁有的JSON:

val json = Json.parse(
    """
    {
        "message": "Bla bla bla",
        "updated_time": "2016-09-17T12:48:12+0000"
    }
    """
)

相應的案例類是:

import org.joda.time.DateTime
final case class FacebookPost(message: String, updated_time: DateTime)

我還添加了此隱式DateTime閱讀器(我也嘗試了其他方法):

 implicit val readsJodaLocalDateTime = Reads[DateTime](js =>
        js.validate[String].map[DateTime](dtString => new DateTime(dtString)))

但是,當我嘗試將json轉換為相應的case類( json.as[FacebookPost] )時,出現以下錯誤:

play.api.libs.json.JsResultException: `JsResultException(errors:List((/updated_time,List(ValidationError(List(error.expected.jodadate.format),WrappedArray(yyyy-MM-dd))))))`

我究竟做錯了什么?

您的問題是日期時間的格式: 2016-09-17T12:48:12+0000

默認情況下,Joda的DateTime類無法自動確定您使用的格式,因此您必須使用DateTimeFormat提供提示。

我們的自定義Reads[DateTime]示例:

import play.api.libs.json._
import play.api.libs.json.Reads._
import play.api.libs.functional.syntax._ 

val dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"

val customReads = Reads[DateTime](js =>
  js.validate[String].map[DateTime](dtString =>
    DateTime.parse(dtString, DateTimeFormat.forPattern(dateFormat))
  )
)

implicit val reads: Reads[FacebookPost] = (
  (__ \ "message").read[String] and
  (__ \ "updated_time").read[DateTime](customReads)
)(FacebookPost.apply _)

然后,可以執行以下操作:

val json = Json.parse(
  """
    {
      "message": "Bla bla bla",
      "updated_time": "2016-09-17T12:48:12+0000"
    }
   """)

val post = json.validate[FacebookPost] 
// => JsSuccess(FacebookPost(Bla bla bla,2016-09-17T14:48:12.000+02:00))

編輯:

您無需從頭開始創建Read[DateTime] ,Play中有一個預定義的方法可以幫助您:

object CustomReads /* or wherever you want to define it */ {
  val dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
  implicit val jodaDateReads = play.api.libs.json.Reads.jodaDateReads(dateFormat)
}

完成。 只需在需要時導入即可,例如在模型類的伴隨對象中:

object FacebookPost {
  import utils.CustomReads._
  implicit val reads: Reads[FacebookPost] = Json.reads[FacebookPost]
}

您可以通過從導入中刪除它來“替代” Play提供的隱式Read[DateTime]

import play.api.libs.json.Reads.{DefaultJodaDateReads => _, _}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM