У меня есть объект scala, подобный JSON, состоящий из любой рекурсивной коллекции: scala.collection.Map[String,Any], scala.collection.Seq[Any], а также основные типы: Int, Float, String, Double, Long, который я получаю через веб-API.
Если я попытаюсь напрямую ввести этот объект в mongodb с помощью (например, с помощью вставки), он сработает, если объект представляет собой карту [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)
...