假设我有以下型号:
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]
知道如何实现这一目标吗?
答案 0 :(得分:0)
Play JSON中的宏尚不支持密封系列,因此您必须采用与BSON处理程序相同的方式。