2016-01-06 68 views
0

我試圖執行驗證規則,即輸入Json中的時間戳必須具有指定的時區,使用格式DateTimeFormatter.ISO_OFFSET_DATE_TIME。當輸入不正確時,我想返回一條指示格式不正確的消息。Play-Json解析日期時間字符串以讀取[Instant]

這段代碼工作在預期的格式解析數據:

implicit val instantReads = Reads[Instant] { 
    js => js.validate[String].map[Instant](tsString => 
    Instant.from(OffsetDateTime.parse(tsString, DateTimeFormatter.ISO_OFFSET_DATE_TIME)) 
) 
} 

但拋出一個DateTimeParseException如果格式錯誤。

我該如何修復它以返回JsError("Wrong datetime format")而不是拋出異常?

回答

1

您可以改爲使用Read.flatMap

implicit val instantReads = Reads[Instant] { 
    _.validate[String].flatMap[Instant] { tsString => 
    try { // or Try [T] 
     JsSuccess (Instant.from(OffsetDateTime.parse(tsString, DateTimeFormatter.ISO_OFFSET_DATE_TIME))) 
    } catch { 
     case cause: Throwable => 
     JsError("Wrong datetime format") 
    } 
    } 
}