我有一个像这样的案例类
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())))))
你能帮我解决这个问题吗?
答案 0 :(得分: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._
答案 1 :(得分:-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
)
首先,您应该查看Playframework working with JSON文档。如果您使用的是ReactiveMongo等库,则mongodb查询应返回BSONDocument或JsValue。根据{{3}}:
使用Play2-ReactiveMongo,您可以直接使用嵌入式JSON Play中的库> = 2.1。有一个专门的集合叫 JSONCollection自然地处理JSValue和JSObject ReactiveMongo的BSONDocument。
如果只能以字符串形式接收mongodb查询结果,则需要创建一个函数将其解析为JsValue。
我希望这有帮助!