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)
}
}
last field を削除すると機能します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 {
^
last は暗黙的をget
望んでいるため、明らかにコンパイルされません。Field[MenuItem]
しかし、私がそれを定義した場合、それはMenuItem
ほとんどのコピーアンドペーストではDocParser[MenuItem]
ないでしょうか?
どのようにエレガントにしますか?