Scala ReactiveMongo混合类型映射到BSONDocument

Scala ReactiveMongo混合类型映射到BSONDocument,scala,reactivemongo,Scala,Reactivemongo,使用ReactiveMongo驱动程序,我试图序列化可能未知的 混合类型将[String,Any]映射到BSONDocument中。我的问题与所问的问题非常相似,后者涉及序列化映射的ReactiveMongo文档示例。不幸的是,答案似乎只适用于一致类型的贴图,而我需要它来处理任何类型的贴图。我的地图编写器如下: implicit def ValueMapWriter[V](implicit vw:BSONWriter[V tuple.\u 1->vw.write(tuple.\u 2) } B声

使用ReactiveMongo驱动程序,我试图序列化可能未知的 混合类型
将[String,Any]
映射到BSONDocument中。我的问题与所问的问题非常相似,后者涉及序列化映射的ReactiveMongo文档示例。不幸的是,答案似乎只适用于一致类型的贴图,而我需要它来处理任何类型的贴图。我的地图编写器如下:

implicit def ValueMapWriter[V](implicit vw:BSONWriter[V
tuple.\u 1->vw.write(tuple.\u 2)
}
B声文件(要素)
}
}
下面的编译和序列化非常好,因为所有类型都是int

val allInts=Map(“someInt”->1,“someOtherInt”->2)
val docFromMap:BSONDocument=BSON.writeDocument(allInts)
然而,我似乎无法将它转换为能够处理
Map[String,Any]

val mixedTypes=Map(“someDouble”->234.324,“someString”->“abc”,“someInt”->1)
val docFromMap:BSONDocument=BSON.writeDocument(混合类型)
结果:

错误:(134,54)找不到参数writer的隐式值:reactivemongo.bson.BSONWriter[scala.collection.immutable.Map[String,Any],reactivemongo.bson.BSONDocument]
val docFromMap:BSONDocument=BSON.writeDocument(混合类型)
^

为了实现这一点,我可能缺少隐式的一些基本概念,在编译时没有明确知道映射中每个字段的类型。

接受cchantep的建议,我通过匹配映射中的不同类型并将它们写入e文档。这当然可以扩展以处理嵌套的映射和数组。这里可以看到一个很好的例子:。对于上面列出的混合类型平面映射的场景,这对于我关心的值类型非常有效:

def writeObject(obj: Map[String,Any]): BSONDocument = BSONDocument(obj.map(writePair))

def writePair(p: (String, Any)): (String, BSONValue) = (p._1, p._2 match     {
    case value: String  => BSONString(value)
    case value: Double  => BSONDouble(value)
    case value: Int     => BSONInteger(value)
    case value: Boolean => BSONBoolean(value)
    case value: Long    => BSONLong(value)
    case other => BSONNull
})
用法:

val mixedTypes = Map("someDouble" -> 234.324, "someString" -> "abc", "someInt" -> 1)
val docFromMap: BSONDocument = writeObject(mixedTypes)

隐式映射用于类型类,这不是魔术,但正如所说的那样,需要一致的类型,而不是
Any
。您可以用类型安全的东西替换映射,也可以用
JsObject
替换映射(这种映射具有可以从JSON语义中发现的类型)