需要json反序列化器用于第三方案例类

时间:2014-09-10 02:30:15

标签: json mongodb scala playframework

我正在为Scala Play实施SecureSocial服务!应用。我正在使用ReactiveMongoPlugin来访问MongoDB存储。这是代码......

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 个答案:

答案 0 :(得分:1)

ReadsWrites添加到库案例类非常类似于将它们添加到您自己的类中。您需要为每个库案例类创建ReadWrite。例如,假设我们有这些案例类:

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

由于这些ReadsWrites是隐含的,因此导入它们会自动使它们在您需要的地方工作。

有关详细信息,请参阅documentation