【问题标题】:Format an ISODate form field in ReactiveMongo Play JSON在 ReactiveMongo Play JSON 中格式化 ISODate 表单字段
【发布时间】:2018-05-08 23:22:31
【问题描述】:

将 MongoDB 与 Play Framework 和 ReactiveMongo Play JSON library 一起使用;我正在尝试正确配置 form。我有一些日期存储在 MongoDB 中,它们位于 ISODate 包装器/monad 中,并作为 JSObject 处理:

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

我使用automated mapping in 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 字段,但这是我遇到困难的地方。我找不到在哪里包含一个隐式对象来格式化一个新类型,因为 shown herethis 也没有帮助我解决这个问题(看起来它现在可能已经过时了)。

我认为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 的正确位置 - 我认为这应该在 companion 对象中 of FormData(其中格式用于嵌套字段)。事实并非如此,所以我再次接近社区。感谢您的任何建议 - 特别是如果有更好的方法来处理这个问题。

【问题讨论】:

  • 说真的 - 没有人对此有所了解吗?

标签: json mongodb scala playframework


【解决方案1】:

我知道答案就在那里,但绝对不应该隐藏得这么好!这个适合任何感受到我痛苦的人。所以我改变了以下内容:

   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)的 companion 对象 中放置以下内容(这是从 Stephane Godbillon's answer here 更改的):

  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
    )
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2018-03-17
    • 2012-11-05
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多