如何创建自定义ReactiveMongo Reader&对象的作家?

时间:2016-09-10 14:00:00

标签: scala playframework play-reactivemongo

假设我有以下型号:

case class Game(var _id: Option[BSONObjectID] = None,
                   name: String,
                   genre: Genre.Kind,
                   var created: Option[DateTime] = None,
                   var updated: Option[DateTime] = None
                  )

我想存储Game的实例,如下所示: {"_id": "ObjectId(12345)", "name": "My Shooter Game", "genre": "Shooter", …}

对于Genre我想将值存储为String,但是我想以编程方式处理类型而不是值。

所以这就是我认为可行的方法:

object Genre {

  sealed trait Kind

  implicit val genreJsonFormat = Json.format[Genre.Kind]

  case object Shooter extends Kind {
    val name = "Shooter"

    override def toString = name
  }

  def getGenre(genre: String) = genre match {
    case Shooter.name => Shooter
    // ...
  }

  implicit object GenreWriter extends BSONDocumentWriter[Genre.Kind] {
    def write(genre: Genre.Kind): BSONDocument =
      BSONDocument("genre" -> genre.toString)
  }

  implicit object GenreReader extends BSONDocumentReader[Genre.Kind] {
    def read(doc: BSONDocument): Genre.Kind = Genre.getGenre(doc.getAs[String]("genre").get)
  }

}

不幸的是,我收到了这个编译错误:

  

找不到unapply或unapplySeq函数

对于:

implicit val genreJsonFormat = Json.format[Genre.Kind]

知道如何实现这一目标吗?

1 个答案:

答案 0 :(得分:0)

Play JSON中的宏尚不支持密封系列,因此您必须采用与BSON处理程序相同的方式。