我有一个类似 JSON 的 scala 对象,由以下任何递归集合组成:scala.collection.Map[String,Any]、scala.collection.Seq[Any],以及基本类型:Int、Float、String、Double、Long、我通过 Web API 收到的。
如果我尝试使用(例如使用插入)直接将此对象喷射到 mongodb 中,则如果该对象是非集合类型的 map[String,_] 则它可以工作。但是如果地图值本身就是集合,那么 mongodb 驱动程序库就会失去理智并进入无限循环(堆栈溢出)。获取这样一个对象并将其放置在 MongoDB 中的正确方法是什么。
(有 casbah,但看起来主要用于增量构建对象,而不是转换现有对象)。
这是一个失败的例子:
val obj2= scala.collection.mutable.HashMap[String,Any]()
obj2 += ("a" -> 123)
val obj1= scala.collection.mutable.HashMap[String,Any]()
obj1 += ("x" -> List(obj2) )
val anyMapLike:scala.collection.Map[String,Any] = obj1
collection.insert( anyMapLike ) // Stack overflow here!
......去香蕉:
java.lang.StackOverflowError: null
at scala.collection.convert.Wrappers$MutableMapWrapper.underlying(Wrappers.scala:216)
at scala.collection.convert.Wrappers$MutableMapWrapper.productElement(Wrappers.scala:216)
at scala.runtime.ScalaRunTime$$anon$1.next(ScalaRunTime.scala:185)
...
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234)
at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:295)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234)
at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:295)
at org.bson.BasicBSONEncoder._putObjectField(BasicBSONEncoder.java:234)
at org.bson.BasicBSONEncoder.putIterable(BasicBSONEncoder.java:295)
...