[英]Play & ReactiveMongo: How to deserialize Json from request in controller
[英]ReactiveMongo: How to deserialize a list into an Option
以下是代表用户的case类,其伴随对象提供了BSONDocumentWriter
和BSONDocumentReader
来对BSON进行序列化/反序列化:
case class User(
id: Option[BSONObjectID],
name: String,
addresses: Option[List[BSONObjectID]]
)
object User {
implicit object UserWriter extends BSONDocumentWriter[User] {
def write(user: User) = BSONDocument(
"_id" -> user.id.getOrElse(BSONObjectID.generate),
"name" -> user.name,
"addresses" -> user.addresses
)
}
implicit object UserReader extends BSONDocumentReader[User] {
def read(doc: BSONDocument) = User(
doc.getAs[BSONObjectID]("_id"),
doc.getAs[String]("name").get,
doc.getAs[List[BSONObjectID]]("addresses").toList.flatten,
)
}
}
上面的代码无法编译,因为User.addresses
是一个Option
并且我总是收到以下错误:
/home/j3d/Projects/test/app/models/User.scala:82: polymorphic expression cannot be instantiated to expected type;
[error] found : [B]List[B]
[error] required: Option[List[reactivemongo.bson.BSONObjectID]]
[error] doc.getAs[List[BSONObjectID]]("addresses").toList.flatten,
^
如果输入的BSON包含addresses
,如何将其反序列化为Option[List[BSONObjectID]]
?
为什么要调用toList
然后flatten
? 如果我正确地阅读了BSONDocument
的文档,则getAs
方法将返回类型T
的Option
,在这种情况下,您将T
指定为List[BSONObjectID]
。 当你调用toList
,你基本上拆包Option
到一个空List
(在的情况下, None
),或者到实际List
中的情况下Some
。 然后这里的flatten
似乎没有做任何相关的事情。 您不能按以下方式进行操作吗?
doc.getAs[List[BSONObjectID]]("addresses")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.