0

我正在使用 Play、Scala、MongoDB 开展一个项目。我想将它存储List[Datetime]在一个集合中,所以我需要它的格式器。为了存储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)
}

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

4

2 回答 2

1

您需要为 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())
于 2016-11-28T23:09:42.953 回答
0

你可以使用MongoDateFormats这个项目中的 simple-reactivemongo

于 2017-02-11T09:29:40.550 回答