0

当试图插入一个MongoDBObject包含一个JsNumber

val obj: DBObject = getDbObj // contains a "JsNumber()"
collection.insert(obj)

出现以下错误:

[error] play - Cannot invoke the action, eventually got an error: java.lang.IllegalArgumentException: can't serialize class scala.math.BigDecimal

我试图用 替换JsNumberInt但我得到了同样的错误。

编辑

可以通过此测试代码重现错误。scalatest 中的完整代码 ( https://gist.github.com/kman007us/6617735 )

val collection = MongoConnection()("test")("test")
val obj: JsValue = Json.obj("age" -> JsNumber(100))
val q = MongoDBObject("name" -> obj)
collection.insert(q)
4

2 回答 2

2

Plays JSON 实现没有注册处理程序 - 您可以添加处理程序以自动将播放 Js 类型转换为 BSON 类型。但是,这不会处理mongodb 扩展 json,它具有处理非本地 json 类型的特殊结构,例如:日期和 objectid 翻译。

使用它的一个例子是:

import com.mongodb.util.JSON
val obj: JsValue = Json.obj("age" -> JsNumber(100))
val doc: DBObject = JSON.parse(obj.toString).asInstanceOf[DBObject]

有关 bson 转换器的示例,请参阅joda time 转换器

于 2013-09-19T18:29:15.577 回答
1

似乎 casbah 驱动程序与 Plays 的 JSON 实现不兼容。如果我查看 cashbah 代码,您似乎必须使用一组MongoDBObject对象来构建查询。以下代码段应该可以工作。

val collection = MongoConnection()("test")("test")
val obj = MongoDBObject("age" -> 100)
val q = MongoDBObject("name" -> obj)
collection.insert(q)

如果您需要与 Play 的 JSON 实现兼容,请使用ReactiveMongoPlay-ReactiveMongo

编辑

也许这个Gist可以帮助将JsValue对象转换为MongoDBObject对象。

于 2013-09-19T07:06:58.510 回答