尝试插入包含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
我尝试用JsNumber
替换Int
,但我收到同样的错误。
编辑
可以通过此测试代码重现错误。 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)
答案 0 :(得分:2)
Plays JSON实现没有注册处理程序 - 您可以添加处理程序以自动将播放Js类型转换为BSON类型。但是,它不会处理具有处理非本机json类型的特殊结构的mongodb extended json,例如:date和objectid translations。
使用它的一个例子是:
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 transformer。
答案 1 :(得分: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实施兼容,请使用ReactiveMongo和Play-ReactiveMongo。
修改强>
也许这个Gist有助于将JsValue
个对象转换为MongoDBObject
个对象。