2016-09-10 7 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

Настоятельно рекомендуется прочитать [документация] (https://www.playframework.com/documentation/2.5.x/ScalaJson) – cchantep

+0

'Json.format' не предоставлен ReactiveMongo, но Play JSON – cchantep