2016-09-10 56 views
0

比方說,我有以下型號:如何爲對象創建自定義的ReactiveMongo Reader&Writer?

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我想存儲的值作爲一個字符串,但編程我想處理類型而不是價值。

所以這是我想會的工作:

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) 
    } 

} 

不幸的是,我得到這個編譯錯誤:

No unapply or unapplySeq function found

爲:

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

任何想法如何,我可以實現那?

回答

0

來自Play JSON的宏還不支持密封系列,因此您必須以與BSON處理程序完成相同的方式進行操作。

+0

建議先閱讀[documentation](https://www.playframework.com/documentation/2.5.x/ScalaJson) – cchantep

+0

'Json.format'不是ReactiveMongo提供的,而是Play JSON – cchantep

相關問題