Play-Json 将日期时间字符串解析为 Reads[Instant]

Play-Json parsing date time string to Reads[Instant]

我正在尝试执行验证规则,即输入 Json 中的时间戳必须使用格式 DateTimeFormatter.ISO_OFFSET_DATE_TIME 指定时区。当输入不正确时,我想return提示格式错误

此代码段用于解析预期格式的数据:

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

但如果格式错误则抛出 DateTimeParseException

如何将其修复为 return JsError("Wrong datetime format") 而不是抛出异常?

您可以改用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")
    }
  }
}