【问题标题】:Case classes for formatting json - with and without the object id用于格式化 json 的案例类 - 有和没有对象 id
【发布时间】:2013-11-26 20:10:38
【问题描述】:

我正在编写一个 play2 应用程序,它通过 rest/json 获取数据并使用 reactivemongo 将其存储在 mongodb 中。

我正在使用由案例类和 implicit val myFormat = Json.format[myCaseClass] 构建的模型

目前我有一个来自 mongodb 的对象的案例类。它们包含 _id 字段,一切正常。进来的新对象自然没有这个 id 字段,所以 Json.fromJson[myCaseClass](req.body) 验证器失败。

我真的必须为新对象创建另一个案例类,还是有一个更干、更优雅的解决方案,而无需复制类并删除 _id?

【问题讨论】:

  • 一种选择是在 json 中包含一个虚拟 _id。
  • ... 或将 _id 字段设为 Option

标签: scala playframework-2.0 reactivemongo


【解决方案1】:

我会使用解析器组合器 API 并创建一个 json 格式,或者甚至可能只是一个 Reads[T],它处理传入的可能没有 id 的字段。比如:

implicit val readsMyClass: Reads[MyClass] = (
  (__ \ "id").readNullable[Id] and
  (__ \ "someProperty").read[String]
)(create _)

def create(maybeId: Option[Id], someProperty: String) = 
   MyClass(maybeId.getOrElse(...generate id...), someProperty)

有关更多信息,请参阅文档:http://www.playframework.com/documentation/2.2.x/ScalaJsonCombinators

【讨论】:

    【解决方案2】:

    我听从了建议,_id: Option[BSONObjectID] 成功了。 没有必要实现读取器,因为implicit val userFormat = Json.format[User] 能够创建包含选项的宏。

    【讨论】:

      猜你喜欢
      • 2017-06-13
      • 1970-01-01
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-28
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      相关资源
      最近更新 更多