1

我有一个这样的案例类

case class Wish(_id: Option[String], title : String, text :String, cash: Int, created_at:    Option[DateTime], updated_at : Option[DateTime])

我还定义了一个隐式读取验证器,如下所示

implicit val wishFormat = Json.format[Wish]

我正在尝试将 Mongodb 文档读入我的愿望类,但出现如下错误

scala> val js = "{\"_id\":{\"$oid\":\"5259c384dd8251bb085adfb4\"},\"title\":\"Shrikar\",\"text\":\"test\",\"cash\":12.0,\"created_at\":1381614468235,\"updated_at\":1381614468235}"
js: String = {"_id":{"$oid":"5259c384dd8251bb085adfb4"},"title":"Shrikar","text":"test","cash":12.0,"created_at":1381614468235,"updated_at":1381614468235}

scala> val test = Json.parse(js)
test: play.api.libs.json.JsValue = {"_id":{"$oid":"5259c384dd8251bb085adfb4"},"title":"Shrikar","text":"test","cash":12.0,"created_at":1381614468235,"updated_at":1381614468235}

scala> test.validate[Wish]
res11: play.api.libs.json.JsResult[Wish] =   JsError(List((/_id,List(ValidationError(validate.error.expected.jsstring,WrappedArray())))))

你能帮我解决这个问题吗?

4

2 回答 2

1

您的 ID 必须是 BSONObjectID。

case class Wish(
  _id: Option[BSONObjectID],
  title: String,
  text: String,
  cash: Int,
  created_at: Option[DateTime],
  updated_at: Option[DateTime]
)

然后你必须从Play-ReactiveMongo插件中导入格式:

import play.modules.reactivemongo.json.BSONFormats._
于 2013-10-13T05:26:26.253 回答
-1

读取格式将 play.api.libs.json.JsValue 转换为对象。Reads期待一个看起来像这样的 json 值:

import play.api.libs.json.{Json, JsValue}
val js: JsValue = Json.obj(
  "_id" -> "5259c384dd8251bb085adfb4",
  "title" -> "Shrikar",
  "text" -> "test",
  "cash" -> 12.0,
  "created_at" -> 1381614468235,
  "updated_at" -> 1381614468235
)

您应该首先查看使用 JSON文档的 Playframework 。如果您使用ReactiveMongo等库,则 mongodb 查询应返回 BSONDocument 或 JsValue。根据Reactive Mongo 文档

使用 Play2-ReactiveMongo,您可以直接使用 Play >= 2.1 中嵌入的 JSON 库。有一个名为 JSONCollection 的专用集合自然地处理 JSValue 和 JSObject 而不是 ReactiveMongo 的 BSONDocument。

如果只能以字符串形式接收 mongodb 查询结果,则需要创建一个函数将其解析为 JsValue。

我希望这有帮助!

于 2013-10-13T04:52:21.037 回答