有谁知道如何使用subset2将 DBObject 解析为案例类对象?超级简洁的文档对我没有帮助:(
考虑以下案例类
case class MenuItem(id : Int, name: String, desc: Option[String], prices: Option[Array[String]], subitems: Option[Array[MenuItem]])
object MenuItem {
implicit val asBson = BsonWritable[MenuItem](item =>
{
val buf: DBObjectBuffer = DBO("id" -> item.id, "name" -> item.name)
item.desc match { case Some(value) => buf.append("desc" -> value) case None => }
item.prices match { case Some(value) => buf.append("prices" -> value) case None => }
item.subitems match { case Some(value) => buf.append("subitems" -> value) case None => }
buf()
}
)
}
我写了这个解析器
val menuItemParser: DocParser[MenuItem] = int("id") ~ str("name") ~ str("desc").opt ~ get[Array[String]]("prices").opt ~ get[Array[MenuItem]]("subitems").opt map {
case id ~ name ~ desc_opt ~ prices_opt ~ subitems => {
MenuItem(id, name, desc_opt, prices_opt, subitems)
}
}
如果我删除最后一个字段,它会起作用subitems
。但是上面显示的版本无法编译,因为MenuItem
有引用自身的字段。它给了我以下错误
Cannot find Field for Array[com.borsch.model.MenuItem]
val menuItemParser: DocParser[MenuItem] = int("id") ~ str("name") ~ str("desc").opt ~ get[Array[String]]("prices").opt ~ get[Array[MenuItem]]("subitems").opt map {
^
它显然不能编译,因为 lastget
想要Field[MenuItem]
隐式。但是,如果我将其定义为MenuItem
,那不是几乎是复制粘贴DocParser[MenuItem]
吗?
你会如何优雅地做到这一点?