繁体   English   中英

在ReactiveMongo Play JSON中格式化ISODate表单字段

[英]Format an ISODate form field in ReactiveMongo Play JSON

将MongoDB与Play框架和ReactiveMongo Play JSON库结合使用 ; 我正在尝试正确配置表单 我有一些存储在MongoDB中的日期,这些日期在ISODate包装器/ monad中,并作为JSObject处理:

   Json.obj("dateOfBirth" -> Json.obj("$date" -> dateTimeLong))

我的案例类在Play中使用自动映射的示例是:

   case class FormData(_id: Option[BSONObjectID], name: String, dateOfBirth: Option[JSObject])

形式如下:

  object MyForm {

     val form = Form(
        mapping(
          "_id" -> ignored(Option.empty[BSONObjectID]),
          "name" -> nonEmptyText,
          "dateofBirth" -> ? // not `date` or `optional(date)`
        )
     )

  }

我认为我需要在form自定义绑定dateOfBirth字段,但这是我遇到的困难。 我找不到在哪里包括隐式对象以格式化一种新类型,如此处所示也无济于事(看起来现在可能已经过时了)。

我认为bind方法可能看起来像这样:

  def bind(date: Date, dateFieldName: String): JsObject = {

    val longDate = new DateTime(date.getTime())
      .withZoneRetainFields(DateTimeZone.UTC)
      .withZone(DateTimeZone.getDefault())
      .getMillis

    Json.obj(s"$$$dateFieldName" -> JsNumber(longDate))

  }

但是我可能是错的,但是尝试尝试会很好,但是正如我说的那样,我似乎找不到在哪里插入custom formatter的正确位置-我认为这应该在FormData伴随对象中(格式将用于嵌套字段)。 情况并非如此,因此我再次与社区接触。 感谢您的任何建议-特别是如果有更好的方法来解决此问题。

我知道答案就在那里,但绝对不应该如此隐藏! 这是给任何感到我痛苦的人的。 因此,我更改了以下内容:

   case class FormData(_id: Option[BSONObjectID], name: String, dateOfBirth: Option[Date])

和形式

  object MyForm {

     val form = Form(
        mapping(
          "_id" -> ignored(Option.empty[BSONObjectID]),
          "name" -> nonEmptyText,
          "dateOfBirth" -> optional(date)
        )(FormData.apply)(FormData.unapply)
     )

  }

现在是关键部分。 case类同伴对象 (我的对象FormData )中,放置以下内容的地方(这是从Stephane Godbillon的答案此处更改 ):

  implicit val dateRead: Reads[Date] = (__ \ "$date").read[Long].map { date =>
    new Date(date)
  }

  implicit val dateWrite: Writes[Date] = new Writes[Date] {
    def writes(date: Date): JsValue = Json.obj(
      "$date" -> date.getTime
    )
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM