2014-09-10 2 views
0

Я реализую услугу SecureSocial для своего Scala Play! заявление. Я использую ReactiveMongoPlugin для доступа к хранилищу MongoDB. Вот код ...Нужен json deserializer для класса сторонних случаев

lazy val users: JSONCollection = ReactiveMongoPlugin.db.collection[JSONCollection]("users") 

def find(providerId: String, userId: String): Future[Option[BasicProfile]] = { 
    users 
    .find(Json.arr(Json.obj("providerId" -> providerId), Json.obj("userId" -> userId))) 
    .cursor[BasicProfile] 
    .headOption 
} 

BasicProfile является SecureSocial случай класс, который не реализует JSon сериализатора/десериализации. Так предсказуемо я получаю ...

No Json deserializer found for type securesocial.core.BasicProfile 

Я знаю, как реализовать чтение/запись для моих собственных классов дела, но я тоже новичок в Scala, чтобы узнать, как сделать это для библиотеки классов дела, как BasicProfile. Как добавить json для чтения/записи в BasicProfile?

ответ

1

Добавление Reads и Writes в классы классов библиотеки действительно похоже на добавление их в свои классы. Вам нужно будет создать Read и Write для каждого класса case библиотеки. Например, предположим, что у нас были эти тематические классы:

case class Example(a: String, b: ExampleB) 
case class ExampleB(c: Int) 

Они должны быть разобрана с помощью этих:

implicit val exampleWrites: Writes[Example] = (
    (JsPath \ "a").write[String] and 
    (JsPath \ "b").write[ExampleB] 
) 

implicit val exampleBWrites: Writes[ExampleB] = (
    (JsPath \ "c").write[Int] 
) 

implicit val exampleReads: Reads[Example] = (
    (JsPath \ "a").read[String] and 
    (JsPath \ "b").read[ExampleB] 
) 

implicit val exampleBReads: Reads[ExampleB] = (
    (JsPath \ "c").read[Int] 
) 

Поскольку эти Reads и Writes неявные, импортируя их должно автоматически заставить их работать, где вам нужно их.

Для получения дополнительной информации см. documentation.

+0

Я пробовал это раньше, но получил ошибку компиляции 'Не могу найти неявный ExecutionContext'. После повторной проверки ошибки я вижу все, что мне нужно сделать, это добавить «import scala.concurrent.ExecutionContext.Implicits.global'. Теперь это работает. Благодаря! –