List [DateTime]的格式化程序播放scala

时间:2016-11-28 16:51:56

标签: scala playframework play-json

我正在使用Play,Scala,MongoDB开发一个项目。我想将List[Datetime]存储在一个集合中,所以我需要它的fomatters。要存储我使用此格式化程序的Datetime

implicit def dateFormat = {
  val dateStandardFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"

  val dateReads: Reads[DateTime] = Reads[DateTime](js =>
    js.validate[JsObject].map(_.value.toSeq).flatMap {
      case Seq(("$date", JsNumber(ts))) if ts.isValidLong =>
        JsSuccess(new DateTime(ts.toLong))
      case _ =>
        JsError(__, "validation.error.expected.$date")
    }
  )

  val dateWrites: Writes[DateTime] = new Writes[DateTime] {
    def writes(dateTime: DateTime): JsValue = Json.obj("$date"-> dateTime.getMillis())
  }

  Format(dateReads, dateWrites)
}

但是为了存储日期时间列表它不起作用。提前感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您需要为List [DateTime]创建隐式json Writer和Reader。在您的示例中,您只定义了如何序列化和反序列化DateTime类型。在格式化程序下面添加此项应该使框架知道如何 JSONify DateTime列表。 见下面的工作示例:

  val dateStandardFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS"

  val dateReads: Reads[DateTime] = Reads[DateTime](js =>
    js.validate[JsObject].map(_.value.toSeq).flatMap {
      case Seq(("$date", JsNumber(ts))) if ts.isValidLong =>
        JsSuccess(new DateTime(ts.toLong))
      case _ =>
        JsError(__, "validation.error.expected.$date")
    }
  )

  val dateWrites: Writes[DateTime] = new Writes[DateTime] {
    def writes(dateTime: DateTime): JsValue = Json.obj("$date" -> dateTime.getMillis())
  }

  implicit def dateFormat = Format(dateReads, dateWrites)

  implicit val listDateTimeFormat = Format(Reads.list[DateTime](dateReads), Writes.list[DateTime](dateWrites))

  val m = List(DateTime.now(), DateTime.now(), DateTime.now(), DateTime.now(), DateTime.now())

  println(Json.toJson(m).toString())

答案 1 :(得分:0)

您可以使用此项目simple-reactivemongo

中的MongoDateFormats